Qualys SSL Server Test에서 A+ 평가 및 만점 얻기 (nginx)
추가
TLS_AES_128_GCM_SHA256
무효화에 대해 추가. 주의
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을 활성화하면
만점을 달성하려고 하면 인증서의 키 길이를 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을 활성화하면
# 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을 활성화하면
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 )
사양을 올바르게 구현하는 것이 더 중요하다고 생각하기 때문에, 만점을 목표로 하는 것은 역시 취미·실험·자기 만족에 담는 편이 좋을까 생각합니다.
Reference
이 문제에 관하여(Qualys SSL Server Test에서 A+ 평가 및 만점 얻기 (nginx)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ooxif/items/431c5d6db68cc46db60d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)