Child pages
  • nginx 에 HTTPS/SSL 적용하기

Contents


SSL 설정

server {
    listen       80;
    server_name  example.com;
    root         html;

    location / {
        return 301 https://example.com$request_uri;
    }
}


server {
    listen       443;
    server_name  example.com
    root         html;


    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/example.com.chained.crt;
    ssl_certificate_key  /etc/pki/tls/private/example.com.key;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;
    location ~ /\.ht {
         deny  all;
    }
}


SSL chain 구성

SSL 인증서 발급 기관이 브라우저에 기본 포함되지 않아서 SSL 경로를 못 찾을 경우가 있다.

아파치 httpd 에는 이런 용도로 SSLCACertificateFile 라는 지시자가 있지만 nginx 에는 없으므로 다음과 같이 SSL 인증서와 CA 인증서를 하나의 파일로 만들어야 한다.

 cat /etc/pki/tls/certs/lesstif.com.crt /etc/pki/tls/certs/lesstif-root.crt > /etc/pki/tls/certs/lesstif.com.chained.crt

합쳐진 인증서는 nginx 의 ssl_certificate  를 통해 지정해 주면 SSL chain 을 구성할 수 있다.

ssl_certificate      /etc/pki/tls/certs/lesstif.com.chained.crt;

nginx 는 개인키와 일치하는 공개키를 chain 파일의 첫 번째 인증서로 시도하므로 사이트의 SSL 인증서가 첫 번째로 오지 않으면 다음 에러가 발생한다.

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)

각각의 SSL 인증서 파일은 다음과 같이 구분자를 주어야 정상적으로 nginx 가 파싱할 수 있다.

-----BEGIN CERTIFICATE-----
MIIF5TCCBM2gAwIBAgIMAgjYamUwdKuSU+riMA0GCSqGSIb3DQEBCwUAMEwxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSIwIAYDVQQDExlB
PahHbT95UDBzxM9RnpDaoBpvmjllWNOYPQ==
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
MIIETTCCAzWgAwIBAgILBAAAAAABRE7wNjEwDQYJKoZIhvcNAQELBQAwVzELMAkG


예전 SSL 중지 및 최신 TLS 프로토콜 사용

SSLv2와 SSLV3 프로토콜은 취약점이 있으므로 사용하면 안 되며 TLS도 V1.2 이상을 (현재 TLSV1.3)을 권장하지만 브라우저 버전마다 지원하는 TLS 버전이 상이하므로 TLSV1.3 만 설정하면 최신 브라우저가 아닐 경우 문제가 발생할 수 있다.

이런 문제를 해결하기 위해 취약한 프로토콜은 제외하고 TLSV1.1 이상의 프로토콜을  사용하도록 다음과 같이 설정하는 것이 좋다.

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, TLS1 ref: POODLE


강력한 알고리즘 사용

TLS 는 암호화 통신을 위해 사용할 알고리즘을 협상후 결정하는데 RC4 나 Triple DES 같은 오래된 알고리즘을 사용하면 암호화 통신을 하는 이유가 반감된다.

크롬의 경우 TLSV1.2 를 사용하더라도 예전 알고리즘이 사용 가능하면 사이트 정보 보기에서 아래와 같은 메시지를 출력한다.

your connection to site is encrypted using an obsolete cipher suite


그러므로 강력한 알고리즘을 사용하도록 다음과 같이 설정하는 것이 좋다.

ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

이렇게 설정하면 크롬에서 다음과 같은 안내 메시지를 표시한다.

your connection to site is encrypted using an modern cipher suite



Ref


  • No labels

This page has no comments.