인증서가 만료되어 교체 후 동일하게 접속했는데, 한 브라우저는 홈페이지를 띄우고 다른 브라우저는 연결 경고를 띄우는 케이스가 간혹 있습니다. 이럴 때는 정상 화면을 다시 열어 보는 것보다 두 브라우저가 받은 서버 인증서를 비교하는 편이 빠릅니다. 어느 접속 지점에 교체가 덜 됐는지, 단말마다 인증서를 검증하는 조건이 다른지 살펴볼 단서가 됩니다.

브라우저가 받은 인증서부터 비교
경고가 뜬 환경에서 주소창의 호스트명, 오류 코드, 브라우저와 운영체제 버전, 접속망을 기록합니다. 인증서 상세를 열 수 있다면 정상 환경과 경고 환경의 서버 인증서 SHA-256 핑거프린트도 비교해봅니다. 핑거프린터가 다르면 양쪽이 서로 다른 인증서를 받은 것입니다.
CDN이나 로드밸런서가 브라우저와의 TLS 연결을 직접 맺는 구성이라면, 브라우저가 보는 인증서는 그 접속 지점에서 제시합니다. 원본 웹서버의 파일을 교체했더라도 브라우저에 교체 전 인증서가 보인다면, 사용자 요청이 도달한 접속 지점부터 확인합니다. 양쪽에서 새 인증서의 지문이 같다면, 각 접속 지점이 함께 보낸 중간 인증서를 비교할 차례입니다.
OpenSSL로 서버가 보낸 체인 확인
아래 예시의 portal.example을 실제 호스트명으로 바꿉니다. -servername은 연결을 시작할 때 대상 호스트명을 서버에 전달하는 SNI 옵션입니다. 여러 접속 지점을 비교할 때는 -connect에 해당 지점의 IP와 포트를 넣고, -servername에는 같은 호스트명을 유지합니다. OpenSSL — s_client 옵션
openssl s_client -connect portal.example:443 \
-servername portal.example -showcerts < /dev/null
-showcerts는 서버가 그 연결에서 보낸 인증서를 전송 순서대로 보여 줍니다. 브라우저의 인증서 상세 화면에는 브라우저가 자체적으로 구성한 검증 경로가 표시될 수 있습니다. 서버가 실제로 어떤 인증서를 제공했는지 확인할 때는 OpenSSL 출력의 Certificate chain 목록을 봅니다. OpenSSL — s_client 옵션
목록에 새 서버 인증서만 보이면 발급기관이 제공한 체인과 대조합니다. 중간 인증서는 서버 인증서에서 클라이언트가 신뢰하는 루트까지 이어 주는 역할을 합니다. 클라이언트가 이미 신뢰하는 루트는 서버가 전송하는 목록에서 생략할 수 있습니다. RFC 8446 — TLS 1.3 인증서 메시지
Certificate chain은 서버의 전송 내용을 보여 줍니다. Verify return code는 명령을 실행한 환경의 검증 결과이므로, 브라우저에서 경고가 사라졌는지는 해당 단말에서 다시 확인합니다. OpenSSL — s_client 옵션
같은 체인에서 경고가 갈리는 이유
같은 서버 인증서를 받아도 단말이 갖고 있는 중간 인증서나 신뢰하는 루트는 다를 수 있습니다. 예를 들어 Firefox는 일부 중간 인증서를 미리 받아 로컬 캐시에 저장합니다. 빠진 중간 인증서가 캐시에 있는 환경에서는 신뢰 경로를 완성할 수 있습니다. 어느 루트를 신뢰하는지는 브라우저와 단말의 신뢰 설정에 따라 달라집니다. Mozilla — 중간 인증서 사전 로드 Chromium — Chrome Root Store
오류가 호스트명 불일치나 유효기간 문제를 가리키면 그 항목부터 확인합니다. 발급자를 신뢰할 수 없다는 오류라면 서버가 보낸 인증서와 클라이언트의 신뢰 설정을 아래처럼 나눠 살펴봅니다.
| 관찰 결과 | 다음 점검 |
|---|---|
| 같은 호스트에서 교체 전 인증서가 일부 접속 지점에 남음 | 사용자와 TLS 연결을 맺는 지점별 배포 상태 확인 |
| 새 서버 인증서는 같고 일부 접속 지점에서 필요한 중간 인증서가 빠짐 | 해당 지점에 적용한 발급기관의 체인 파일 확인 |
| 서버 인증서와 전송 목록이 같은데 특정 환경에서 발급자를 신뢰하지 않음 | 경고가 발생한 환경의 신뢰 저장소와 연결 가능한 루트 확인 |
Nginx가 브라우저와 직접 TLS 연결을 맺는 구성에서 중간 인증서 누락이 확인됐다면, ssl_certificate가 가리키는 PEM 파일에 서버 인증서를 먼저 두고 발급기관이 제공한 중간 인증서를 뒤에 붙입니다. 설정을 검사하고 반영한 뒤, 같은 호스트와 접속 지점에서 -showcerts를 다시 실행해 전송 목록을 확인합니다. NGINX — 인증서 체인 구성

결론
교체를 마친 뒤에는 사용자 접속 지점이 새 서버 인증서와 필요한 중간 인증서를 보내는지, 처음에 경고가 떴던 환경에서도 새 연결이 열리는지 확인합니다. 확인 기록에는 호스트명, 접속 지점, 서버 인증서 지문, 전송된 중간 인증서, 브라우저 재시험 결과를 함께 남겨 두면 다음 교체 때 비교하기 쉽습니다.