Qualys SSL Server Test에서 A+ 평가 및 만점 얻기 (nginx)

Qualys SSL Server Test : htps //w w.ぁbs. 이 m / sl st /



추가


  • 2018-12-05 OpenSSL v1.1.1 및 TLS v1.3에 대한 대응을 추가합니다.
  • 2019-04-04 TLS_AES_128_GCM_SHA256 무효화에 대해 추가.
  • 2019-08-31 CBC 암호 스위트의 무효화에 대해 추가.

  • 주의



    A+ 평가는 좋다고 해도 만점을 취하려고 하면 대응 브라우저가 적어지거나 서버 부하가 높아지거나 합니다.
    실운용에서는 A 혹은 A+ 평가를 목표로 할 때까지 두고, 만점은 취미로 해 볼 정도로 좋을까 생각합니다.

    증명서 취득시의 주의



    만점을 달성하려고 하면 인증서의 키 길이를 4096bit 이상으로 해야 합니다.
    키 길이가 4096bit 이상이 아니면 Key Exchange가 100이 아닙니다.

    참고 : Let’s Encrypt에서 SSL/TLS 인증서의 RSA 키 길이를 4096비트로 만드는 방법 |

    SSL 관계 설정(알파벳순)


    # HSTS を有効にする。
    # これを有効にすると、クライアントは、初回接続以降は「必ず」 https で接続してくるようになる。
    # 有効にしないと A が評価の上限になり、有効にすることで A+ 評価になる。
    # 「必ず」 https 接続になっていいかどうかはサービスによるので、設定には注意すること。
    add_header Strict-Transport-Security 'max-age=31536000;' always;
    
    # HSTS Preload に登録する場合は、サブドメインも全て https に対応させ、
    # ヘッダに includeSubDomains と preload も含めるようにする。
    # @see https://hstspreload.org/
    #add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload' always;
    
    # OCSP Stapling に対応するため、ネームサーバを設定する必要がある。
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    
    # 証明書に対応する公開鍵を指定。
    # 自分自身の証明書~中間証明書~ルート証明書の一つ前 までの順に結合したファイルを指定する。
    # COMODO の PositiveSSL ならば、送付される証明書に含まれる
    # {your domain}.crt
    # COMODORSADomainValidationSecureServerCA.crt
    # COMODORSAAddTrustCA.crt
    # の 3 つを、この順に結合する。
    # 例)
    # cat {your domain}.crt \
    #   COMODORSADomainValidationSecureServerCA.crt \
    #   COMODORSAAddTrustCA.crt \
    #   > server.crt
    #
    # Let's Encrypt なら fullchain.pem を指定する。
    ssl_certificate /path/to/fullchain.pem;
    
    # 証明書に対応する秘密鍵を指定。
    ssl_certificate_key /path/to/privkey.pem;
    
    # RSA は WEAK と判定される。
    ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA';
    
    # Cipher Strength を 100 にするためには AES128 など 128bit 以下の暗号を除外する必要がある。
    #ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128';
    
    # OpenSSL v1.1.1 以上では !ARIA128 も追加で除外する必要がある。
    # OpenSSL v1.1.1 以上で、かつ TLSv1.3 を有効にした場合、 /etc/ssl/openssl.cnf にも修正が必要 (後述) 。
    #ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128 !ARIA128';
    
    # 2019-08-31 時点、 CBC 暗号スイートが WEAK と判定される。 (ただしスコアに影響はでない)
    # CBC を除外するには !SHA1 !SHA256 !SHA384 を追加する。
    # なお GCM や CHACHA20 暗号スイートの中にも SHA* という名前を持つものがあるが、これらは除外されない。
    # 参考: https://security.stackexchange.com/a/207812
    # CBC が WEAK となった経緯: https://security.stackexchange.com/questions/210072/why-does-ssl-labs-now-consider-cbc-suites-weak
    #ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128 !ARIA128 !SHA1 !SHA256 !SHA384';
    
    # DHE 暗号方式のためのパラメータファイルを指定する。
    # このファイルは `openssl dhparam 2048 -out dhparam.pem` コマンドで生成できる。
    # 2048bit 以上が推奨されている。
    # A 評価にするためには 2048bit 以上で作成する必要がある。
    # Key Exchange を 100 にするためには 4096bit 以上で作成する必要がある。
    ssl_dhparam /path/to/dhparam.pem;
    
    # Key Exchange を 100 にするためには secp384r1 を指定することが必要。
    # 指定しなくても A (A+) 評価は可能。
    #ssl_ecdh_curve secp384r1;
    
    # どの暗号化スイートを使うか、サーバ側が決定するようにする。
    # クライアントが脆弱な暗号化スイートを使おうとすることを防ぐ。
    ssl_prefer_server_ciphers on;
    
    # ssl_protocols を絞ると、対応するブラウザが減る。
    # https://ja.wikipedia.org/wiki/Template:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BTLS/SSL%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E3%81%AE%E5%A4%89%E5%8C%96
    # A 評価にするなら TLSv1 以上に。(ほとんどの携帯電話が非対応に)
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
    # Protocol Support を 100 点にするなら TLSv1.2 のみに。 (IE10 以下や Android 4 以下などが非対応に)
    # OpenSSL v1.1.1 以上であれば、 TLSv1.3 を追加しても良い。
    #ssl_protocols TLSv1.2;
    
    # Session resumption (caching) を有効にする。
    ssl_session_cache shared:SSL:10m;
    
    # OCSP Staplingを有効にする。
    # OpenSSL のバージョンが古すぎると、 "ssl_stapling" ignored というエラーが出る。
    # OpenSSL のバージョンをアップデートすること。
    # 例えば CentOS 5 だとアップデートしきっても古いままなので、有効にはできない。
    ssl_stapling on;
    ssl_stapling_verify on;
    
    # OCSP Stapling で使用する証明書。
    # 中間証明書~ルート証明書の順に結合したファイルを指定する。
    # COMODO の PositiveSSL ならば、送付される証明書に含まれる
    # COMODORSADomainValidationSecureServerCA.crt
    # COMODORSAAddTrustCA.crt
    # AddTrustExternalCARoot.crt
    # の 3 つを、この順に結合する。
    # 例)
    # cat COMODORSADomainValidationSecureServerCA.crt \
    #   COMODORSAAddTrustCA.crt \
    #   AddTrustExternalCARoot.crt \
    #   > trusted.crt
    #
    # Let's Encrypt なら chain.pem を指定する。
    ssl_trusted_certificate /path/to/chain.pem;
    

    OpenSSL >= v1.1.1 및 TLS v1.3을 활성화한 상태에서 만점을 얻는 경우



    OpenSSL v1.1.1에서 TLS v1.3을 활성화하면
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256

  • 라는 암호 스위트가 TLS v1.3에 추가됩니다.
    이 중 TLS_AES_128_GCM_SHA256는 키 길이가 128bit이므로 Cipher Strength 점수가 떨어집니다.
    TLS_AES_128_GCM_SHA256 를 무효화하면 되지만, nginx 에서는 TLS v1.3 에 대한 암호화 스위트를 설정할 수 없습니다.
    ※ TLS v1.3 에서 사용되는 암호 스위트는, 그 이외의 암호 스위트와 완전히 별도로 관리되기 때문에, ssl_ciphers 로 설정할 수 없습니다.
    ※ 2018-12-05 nginx v1.15.7 시점.

    TLS v1.3 의 암호 스위트는 openssl.cnf (일반적으로 /etc/ssl/openssl.cnf 에 있을 것)를 수정하는 것으로 설정할 수 있습니다.
    openssl.cnf 를 열고 상단에 다음과 같이 추가합니다.
    openssl_conf = default_conf
    
    [default_conf]
    ssl_conf = ssl_sect
    
    [ssl_sect]
    system_default = system_default_sect
    
    [system_default_sect]
    ciphersuites = TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384
    
    ciphersuites 에 TLS v1.3 에서 사용하는 암호 스위트를 열거합니다.
    수정 후, nginx 를 재시작 (reload 는 아니고) 하는 것으로 적용됩니다.

    참고 : #1529 (Could not configure TLS1.3 ciphers in OpenSSL 1.1.1 pre4) – nginx

    점수와는 관계가 없지만, AES보다 ChaCha 쪽이 퍼포먼스가 좋은 것 같기 때문에(미 검증), ChaCha 를 먼저 지정하고 있습니다.

    참고 : #1445 (OpenSSL - ChaCha prioritized - Nginx enhancement) – nginx
    참고 : Use ChaCha only if prioritized by clnt by tmshort · Pull Request #4436 · openssl/openssl
    참고 : Do the ChaCha: better mobile performance with cryptography

    TLS_AES_128_GCM_SHA256 무효화 정보


    TLS_AES_128_GCM_SHA256를 비활성화하면 Qualys SSL Server Test에 다음과 유사한 오류 메시지가 표시됩니다. (2019-04-04 시점)

    This server does not support the mandatory cipher suite TLS_AES_128_GCM_SHA256 for TLS 1.3. See RFC 8446 for details.

    이것은, TLS v1. 3의 사양상 TLS_AES_128_GCM_SHA256 가 필수이기 (위해)때문에입니다.
    그러나 TLS_AES_128_GCM_SHA256가 유효하면 Cipher Strength 점수가 떨어집니다.
    이 근처는 조정중인 것 같습니다. (See htps : // 기주 b. 코 m / s s bs / s s b s - s Kan / Issue s / 636 # Isue Komen t-461727819 )

    사양을 올바르게 구현하는 것이 더 중요하다고 생각하기 때문에, 만점을 목표로 하는 것은 역시 취미·실험·자기 만족에 담는 편이 좋을까 생각합니다.

    좋은 웹페이지 즐겨찾기