blog.stackframe.dev

[Nginx] IP로 접속 시 인증서가 노출되지 않게 하기

Nginx를 사용중인 서버에 HTTPS 포트인 443에 도메인 대신 IP로 접속하면 가장 먼저 설정된 HTTPS 서버의 인증서가 전달되고 브라우저에는 인증서 경고가 뜬다. 이때 인증서를 확인하는 것으로 이 서버에 어떤 사이트가 설정되어 있다는 정보가 노출될 수 있다.

파이어폭스의 인증서 경고. 인증서의 도메인이 표시되고 있다.

Nginx 1.19.4 버전부터 ssl_reject_handshake 설정이 추가되었다. httpserver 블록 안에 이 설정을 사용하면 아무 인증서나 보내지 않고 SSL 연결을 거부한다. 설정은 간단하게 아래와 같이 하면 된다:

server
{
    listen 443 ssl default_server;
    ssl_reject_handshake on;
}

이렇게 하면 IP로 접속해도 인증서 경고 대신 연결 실패가 뜬다.

SSL_ERROR_UNRECOGNIZED_NAME_ALERT가 반환되었다.

참고로 아직 Nginx 버전이 1.19.4 이하인 우분투 21.04 같은 배포판에서는 위의 설정을 사용할 수 없다. 이런 경우는 openssl로 직접 인증서를 생성해서 사용하는 것으로 대체할 수 있다. 위의 설정처럼 default_server로 된 더미 server 블록을 만들고 자가 서명 인증서를 사용하도록 하면 된다. 그러면 IP로 접속하여도 실제 사용되는 인증서가 아니라 임의로 만든 인증서가 전달된다.

댓글