SSL 인증서를 비싼 걸로 바꾸면 더 안전해질까
사이트에 무료 인증서를 쓰고 있다. 문득 돈을 내고 더 높은 등급으로 바꾸면 안전해지는지 궁금해졌다. 알아보고 나서 바꾸지 않기로 했다. 대신 다른 걸 고쳤다.
요약
- 인증서 등급(DV·OV·EV)은 암호화 강도와 무관하다. 신원 확인 절차의 차이일 뿐이다.
- 브라우저는 2019년에 EV 표시를 없앴다. 지금은 셋 다 똑같은 자물쇠로 보인다.
- 실제 보안 등급은 서버 설정이 정한다. TLS 버전, 암호 스위트, 보안 헤더다.
- Let's Encrypt는 2025년에 OCSP를 폐지했다. 이제 스테이플링을 켤 수 없다.
DV, OV, EV가 뭐가 다른가
인증서는 검증 수준에 따라 세 가지로 나뉜다.
- DV — 도메인 소유만 확인한다. 자동 발급이라 몇 초면 끝난다. Let's Encrypt가 여기 속한다.
- OV — 법인이 실제로 존재하는지까지 확인한다. 서류 심사가 들어간다.
- EV — 가장 엄격하다. 법인 등기, 소재지, 담당자 통화까지 거친다.
여기서 오해가 하나 생긴다. 등급이 높으면 암호화도 강할 것 같다는 오해다. 그렇지 않다. 세 종류 모두 같은 방식으로 암호화한다. 차이는 이 인증서를 발급받은 주체가 누구인지 얼마나 깐깐하게 확인했느냐뿐이다.
초록 주소창은 이제 없다
EV 인증서를 사는 이유는 대체로 하나였다. 주소창에 회사 이름이 초록색으로 뜨는 것이다. 그게 신뢰를 준다고 봤다.
그 표시가 사라졌다. 크롬은 2019년 77버전에서, 파이어폭스는 70버전에서 EV 표시를 뺐다. 사파리도 같은 방향으로 움직였다. 이유는 간단하다. 사용자가 그 표시를 보지 않았기 때문이다. 오히려 비슷한 상호를 등록해 EV를 받는 식으로 악용될 여지가 있다는 지적도 있었다.
지금은 DV든 EV든 브라우저에 자물쇠 하나만 뜬다. 인증서를 클릭해서 상세 정보를 열어봐야 발급 종류를 알 수 있다. 그렇게까지 확인하는 방문자는 거의 없다.
개인 사이트라면 결론은 명확하다. OV나 EV에 돈을 쓸 이유가 없다. 연 수십만원을 내고 얻는 것이 눈에 보이지 않는다.
그럼 등급은 뭐가 정하나
흔히 말하는 SSL 등급은 SSL Labs 같은 도구가 매기는 점수다. 이건 인증서 종류가 아니라 서버가 어떻게 설정돼 있는지를 본다.
- 프로토콜 — TLS 1.0과 1.1이 켜져 있으면 감점이 크다. 1.2와 1.3만 남기는 것이 기본이다.
- 암호 스위트 — 오래된 알고리즘이 섞여 있으면 깎인다.
- 키 교환 — 키 길이와 방식을 본다.
- HSTS — 이 헤더가 있어야 최고 등급을 받는다.
인증서를 아무리 비싼 걸로 바꿔도 이 네 가지가 엉망이면 점수는 낮게 나온다. 반대로 무료 인증서를 쓰면서도 설정만 잘하면 최고 등급이 나온다.
내 서버는 어땠나
명령 한 줄로 확인할 수 있다.
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -text \
| grep -E "issuer=|Public-Key|Signature Algorithm"
결과는 이랬다. 키는 ECDSA P-256이고 서명은 SHA-384였다. RSA 3072비트에 해당하는 강도인데 연산은 더 가볍다. 무료 인증서라고 약한 걸 주는 게 아니었다.
프로토콜도 확인했다. TLS 1.2와 1.3만 열려 있었고 1.0과 1.1은 이미 막혀 있었다. 손댈 것이 없었다.
측정하다 틀린 이야기
처음에는 TLS 1.0이 열려 있다고 잘못 읽었다. 이런 식으로 확인했기 때문이다.
openssl s_client -tls1 -connect example.com:443 | grep -c "Cipher is"
Cipher is라는 문자열이 나오면 연결된 것으로 봤다. 그런데 핸드셰이크가 실패해도 이 문자열은 출력된다. 뒤에 (NONE)이 붙을 뿐이다. 그걸 세고 있었으니 결과가 반대로 나왔다.
제대로 보려면 협상된 프로토콜을 봐야 한다.
openssl s_client -tls1 -connect example.com:443 2>&1 \
| grep -E "Protocol *:|handshake failure"
측정 도구를 의심하지 않으면 엉뚱한 데를 고치게 된다. 이번에는 고치기 전에 다시 확인해서 다행이었다.
실제로 고친 것
인증서는 그대로 두고 헤더를 손봤다.
- HSTS에
includeSubDomains추가 — 서브도메인까지 HTTPS를 강제한다. 붙이기 전에 모든 서브도메인이 HTTPS로 열리는지 먼저 확인해야 한다. - Content-Security-Policy 추가 — 스크립트를 자기 도메인에서만 불러오게 막았다. 외부 스크립트가 끼어들 여지를 좁힌다.
- Permissions-Policy 추가 — 카메라, 마이크, 위치, 결제 API를 전부 차단했다. 쓸 일이 없으면 꺼두는 편이 낫다.
이쪽이 인증서를 바꾸는 것보다 훨씬 효과가 크다. 비용도 들지 않는다.
OCSP 스테이플링은 못 켰다
하나 더 하려다 막혔다. OCSP 스테이플링이다.
인증서가 폐기됐는지 확인하려면 브라우저가 발급기관에 물어봐야 한다. 이게 느리고, 방문 기록이 발급기관에 남는 문제도 있다. 스테이플링은 서버가 미리 물어본 답을 대신 붙여주는 기능이다.
설정하고 nginx를 다시 읽혔더니 경고가 떴다.
"ssl_stapling" ignored, no OCSP responder URL in the certificate
인증서를 열어보니 정말 OCSP 주소가 없었다. Let's Encrypt가 2025년에 OCSP 지원을 끝냈기 때문이다. 이제는 CRL 방식으로 옮겨갔다. 설정을 남겨둬도 동작하지 않고 경고만 쌓여서 도로 지웠다.
정리
인증서 등급을 올리려던 일은 결국 안 하기로 끝났다. 대신 세 가지를 얻었다.
첫째, 브라우저가 EV를 표시하지 않는 지금 비싼 인증서는 개인 사이트에 의미가 없다. 둘째, 보안 등급은 인증서가 아니라 서버 설정이 정한다. 셋째, 측정 결과를 먼저 의심해야 한다.
무료 인증서를 쓰는 게 부족해 보였는데, 확인해보니 부족한 쪽은 인증서가 아니었다.