작성자 PG의 글

이전글인 ‘NGINX로 SSL을 지원하는 리버스 프록시 설정하기‘ 를 통해 SSL을 지원하는 리버스 프록시를 설정해 보았는데요. 이 세팅만으로는 Qualys SSL LABS 에서 제공하는 SSL Server Test 에서 A+등급을 받을 수가 없습니다.

참고로 SSL 인증서와 private key만 연결했을경우 F등급, 위 포스팅대로 설정했을 경우 B등급을 받을수 있는데요. 이번엔 NGINX에서 A+등급을 받을수 있는SSL 설정을 해보겠습니다. 리버스 프록시 뿐만 아니라 NGINX에서 가상호스트를 설정할때도 같으니 참고하시면 좋겠습니다.

NGINX 헤더 추가

우선 nginx.conf 파일의 http { } 구문 안에 다음의 헤더 코드를 추가합니다.

add_header X-Frame-OptionsSAMEORIGIN;
add_header X-Content-Type-Optionsnosniff;
add_header X-XSS-Protection"1; mode=block";

X-Frame-Options 는 페이지 안에 다른 페이지 (예를 들어 iframe)를 불러오는것에 대한 설정입니다. 옵션을 설명하면

  • SAMEORIGIN : 도메인을 기준으로 같은사이트 내에서는 프레임/iframe으로 불러올수 있지만 다른 사이트의 페이지는 불러올수 없다.
  • DENY : 모든 프레임/iframe을 무효화.
  • ALLOW-From Url : 주소를 설정하고 해당 주소는 프레임/iframe 불러오기가 가능.

입니다.

두번째줄의 X-Content-Type-Options 는 잘못된 MIME 타입이 포함된 응답을 거부하는 옵션이고 세번째줄의 X-XSS-Protection 헤더는 XSS를 통한 세션 하이잭킹을 방지해주는 역할을 합니다.

NGINX SSL 설정

아래의 코드를 ssl.conf 파일로 저장한다음 가상호스트 설정 구문인 server { } 안에 include 로 불러와 활용할수 있습니다.

ssl_protocolsTLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers"EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout1d;

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";

ssl 프로토콜인 SSLv3과 SSLv2는 보안에 취약하기 때문에 사용하지 않고 ssl_ciphers는 브라우저 마다 암호화의 호환성을 위한 설정입니다. 그밖에 SSL 세션 캐시등은 NGINX의 권장설정입니다.

NGINX dhparam 설정

위의 코드들은 보안과 직간접적으로 영향이 있는 설정이였다면 이제부터 득점을 할수 있는 설정인 디피-헬만 파라미터 설정입니다. 물론 점수 뿐만아니라 보안도 강화가 되죠. 이 설명을 위해 윈도에서 OpenSSL 설치하기 를 포스팅 했습니다.

OpenSSL을 실행하고 dhparam 키를 생성합니다. OpenSSL로 디피-헬만 파라미터(dhparam) 키 만들기 참고.

생성된 dhparam.pem 파일을 NGINX의 SSL 설정에 넣어줍니다.

ssl_dhparam파일경로/dhparam.pem;

SSL 인증서 체인 설정

마지막으로 SSL 인증서 체인 설정입니다.

발급받은 인증서 (확장자 crt)와 인증기관의 중간 인증서 내용을 합쳐 체인을 만드는 것으로 텍스트 에디터에서 다음과 같이 만들어줍니다.

-----BEGIN CERTIFICATE-----
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
MIIBOwYLKwYBBAGBtTcBAgMwggEqMC4GCCsGAQUFBwIBFiJodHRwOi8vd3d3LnN0
YXJ0c3NsLmNvbS9wb2xpY3kucGRmMIH3BggrBgEFBQcCAjCB6jAnFiBTdGFydENv
bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTADAgEBGoG+VGhpcyBjZXJ0aWZpY2F0
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
BwEBBIGBMH8wOQYIKwYBBQUHMAGGLWh0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9z
dWIvY2xhc3MxL3NlcnZlci9jYTBCBggrBgEFBQcwAoY2aHR0cDovL2FpYS5zdGFy
dHNzbC5jb20vY2VydHMvc3ViLmNsYXNzMS5zZXJ2ZXIuY2EuY3J0MCMGA1UdEgQc
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----END CERTIFICATE-----

다시 한번 설명하자면 첫번째 —–BEGIN CERTIFICATE—– 부터 —–END CERTIFICATE—– 까지는 사이트의 인증서 부분이, 두번째 —–BEGIN CERTIFICATE—– 부터 —–END CERTIFICATE—– 까지 발급 기관의 중간인증서 내용을 복사합니다. 위 내용을 적당한 이름의 확장자 .pem (예시 : 사이트주소.pem) 으로 저장합니다.

그리고 nginx의 인증서 설정에 위에 생성한 파일을 불러옵니다.

ssl_certificate파일경로/mystor_chain.pem;

NGINX SSL 설정 예시 코드

server {
listen 443;
server_name pluto.mystor.net;

ssl on;
ssl_certificatessl/pluto/pluto_chain.pem;
ssl_certificate_keyssl/pluto/pluto.key;
ssl_dhparamssl/dhparam.pem;

includessl.conf;

location / {
proxy_pass https://192.168.0.53:443/;
}
}

필자의 NGINX 설정입니다. 위의 헤더/보안 관련 코드를 ssl.conf로 저장하고 dhparam 과 인증서 체인을 불러오는 설정입니다.

qualys_ssl_lab_ssl_server_test_01위와 같이 설정해서 무료 인증서로도 A+ 등급을 받을수 있습니다.

single openssl logo
윈도우에서 OpenSSL 설치하기
자체 인증키와 SSL 관련 테스트를 할수 있는 OpenSSL은 기본적으로 리눅스판이 배포되는데 윈도에서도 OpenSSL을 활용할수 있게 윈도용 바이너리를 설치하는…
startssl decrypt 01
STARTSSL에서 받은 Private Key를 복호화 하기
아파치나 윈도 서버등 암호화된 Private Key를 사용하면 애로사항이 꽃피거나 사용이 불편할 경우가 생기는데 StartSSL에서는이 암호화된 Private Key를 복호화하는 기능을…