SSL 인증서라는 게 결국은 신뢰할 수 있는 기관이 “이 도메인은 저희가 인증하니 믿어도 됩니다”라는 의미로 인증서에 서명을 해주는 개념인데 이때 서명 주체인 신뢰할 수 있는 인증 기관을 CA(Certificate Authority)라고 한다.
이런 방식으로 웹 사이트들은 CA가 서명한 인증서를 자기들 서버에 설치하고 일반 사용자들이 https 암호화 통신을 할 수 있게 한다.
대표적인 CA 기관으로는 DigiCert, Entrust, GlobalSign, GoDaddy 등이 있다.
예를 들어 네이버에 적용된 인증서를 보면 DigiCert가 서명한 인증서인 걸 확인할 수 있다.
이게 인터넷으로 제공되는 웹 사이트가 SSL 인증서를 적용하는 방식이다.
루트 인증서의 존재
인증서는 서버에만 적용하면 되는 건 아니고 통신할 때 클라이언트에서 해당 인증서가 루트 인증서가 서명한 게 맞다는 걸 확인해야되는데 그러려면 CA가 인증한 루트 인증서가 클라이언트에 있어야 한다.
그런데 CA가 서명한 루트인증서는 전 세계적으로 믿기로 약속된 거기 때문에 OS나 웹 브라우저에 기본적으로 내장되어 있다. 그런 이유로 서버에 인증서를 적용하면 클라이언트 쪽은 딱히 신경쓸게 없다.
실제로 엔지니어들은 자사 솔루션에 SSL 적용해달라는 요청을 간간히 받는데 이때 기업이 CA가 서명한 공인 인증서를 주면 서버에만 인증서를 적용하고 끝내면 된다.
자체 서명한 인증서를 사용하는 경우
하지만 자체 서명한 인증서를 주면서 https를 적용해달라고 하는 경우도 있는데 이럴 땐 클라이언트에도 루트 인증서를 배포해야 한다고 알려줘야 한다.
자체 서명이라는 건 쉽게 말해 인증서를 발행하는 기업 스스로가 “이 도메인 저희껀데 저희가 셀프 인증합니다”하면서 서명하는 거다. openssl 같은 툴을 이용하면 자체 서명한 인증서를 만들 수 있다.
당연하게도 자체 서명한 루트 인증서는 근본이 없기 때문에 OS나 웹 브라우저에 존재하지 않고 이 인증서가 적용된 서버와 클라이언트와 통신하려면 클라이언트에 수동으로 해당 루트 인증서를 배포해야 된다.
왜 자체 서명한 인증서를 사용하나?
일반적으로 모든 클라이언트에 자체 서명한 루트 인증서를 배포하면서까지 자체 서명한 인증서를 쓰는 거 같지는 않고 관리자 등 일부만 https를 사용할 필요가 있을 때 간단히 적용할 때 사용하는 거 같다.
서버 to 서버 통신에 SSL을 적용할 때 사설 인증서를 사용하는 경우도 있다. 예를 들어 로그인 인증을 LDAPS로 하면 LDAP 서버에 사설 인증서를 적용하는 식이다.
사설 인증서는 돈도 안 들고 인증서 발급을 신청할 때 필요한 도메인이나 기업 인증 절차도 필요 없기 때문에 간단히 쓸 수 있다.