2014년 8월 22일 금요일

Nginx에서 HTTPS Optimizing

1. 연결 인증서 캐싱(Connection credentials caching)
SSL/TLS의 대부분 오버헤드는 초기의 연결 setup이다.

이 연결을 캐싱하면 다음 요청들이 좀 더 빨라진다.

설정에 다음을 추가한다.

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
이는 모든 워커 프로세스들 사이에 공유되는 캐쉬를 생성한다.
캐쉬 사이즈는 bytes이고 4000 세션은 1MB에 저장된다고 한다. 20MB는 80000 세션을 저장하게 될 것이다.

2. SSL을 사용하지 않기~

SSL은 TLS에 의해 대체된다. SSL을 계속 이야기 하는 건 오래된 습관과 관습이 아닐까 한다.(이 건 원본 저자의 의견)

SSL은 몇 가지 약점을 가지고 있기 때문에(이건 찾아봐야 함) 실지적으로 다양한 공격이 있었다.

TLS를 지원 안 하는 브라우저는 IE 6이다. (굿바이 했으니~ 패스)

TLS의 최신 버전은 1.2다. 그러나 새로운 브라우저들과 라이브러리들이 여전히 TLS 1.0을 사용한다.

따라서 설정에 다음을 추가한다.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
3. 암호화 모듈들을 옵티마이징

저자가 왜 이것을 옵티마이징 해야하는지.. 사용할 때 안전한 것만 지정해서 쓰면 될 거 같은데.. 여튼 한 번 해봤다.

설정에 다음을 추가하고

ssl_prefer_server_ciphers on;
아래 설정 중에 하나면 선택해서 쓰면 된다. (옵션 1과 옵션 2의 차이는 원본 참조)

# Cipher suite option 1:
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;

        # Cipher suite option 2:
        #ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        # If you absolutely need IE8 compatibility, use this:
        #ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5;
4. OCSP stapling
Online Certificate Status Protocol(OCSP) 는 현재 인증서의 폐지 상태를 체크하는 프로토콜이다. 브라우저가 인증서를 볼 때 해당 인증서가 폐지 안 됐는지 체크하기 위해 인증서를 발행한 곳과 접촉한다. 물론 이 것은 연결을 초기화하는데 오버헤드가 된다. 또한 이 과정에서 3자(인증서를 발행한 곳)가 포함되어서 프라이버시 이슈가 있다.

이것을 적용하려면 Nginx 1.3.7 이상이 필요하다.
그리고 인증서를 발행하는 사이트에 가서 아래 파일을 다운 받는다.
AddTrustExternalCARoot.crt PositiveSSLCA2.crt
우리는 Comodo 인증서를 다운 받기 때문에 아래 URL에서 다운받았다.
https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/853/74/addtrustexternalcaroot
https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/943/74/intermediate-positivessl-ca-2

그런 다음 한개의 파일로 합친다.

cat AddTrustExternalCARoot.crt PositiveSSLCA2.crt > trustchain.crt
이제 적절한 위치(예: /etc/nginx/cert/trustchain.crt)에 넣고 Nginx의 설정을 아래와 같이 추가한다.
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
resolver 8.8.8.8 8.8.4.4;
stapling과 관련 없이 resolver가 들어가 있다. 이건 DNS 주소이고 2개의 DNS주소는 구글의 public DNS 주소이다. 다른 DNS 주소를 넣어도 상관없다.

5. Strict Transport Security
SPDY를 사용할 때 모든 HTTP 요청을 HTTPS로 redirect하고 싶다면 Strict Transport Security를 사용하고 싶을 거라고 하는데 SPDY를 사용 안 하므로 패스 했다.

6. 적용 결과
적용해보니 https로 사용하는 우리 사이트에서는 약 400ms 정도 빨라졌다.

좀 더 정확한 내용을 보고 싶으면 아래 원본을 읽어 보시길~


원본:
 https://bjornjohansen.no/optimizing-https-nginx

댓글 없음:

댓글 쓰기