はじめに
nginxでは設定ファイルにてSSL通信に関するパラメータを管理できますが、プロトコルは明示的に指定しない場合は以下が許容されています。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2
今回は明示的にTLS1.0とTLS1.1を受け付けないように設定変更を行い、opelsslコマンドで疎通確認する流れについて解説しました。
尚、同プロトコルは第三者により通信の一部(Cookie関連)が解読されてしまう脆弱性があることから利用は推奨されていません。
環境情報
# nginx -v nginx version: nginx/1.20.2
$ openssl version OpenSSL 1.1.1l
変更前の疎通確認
opensslコマンドでNginxが導入されているサーバにTLS1/TLS1.1で接続するには以下のコマンドを押下します。
openssl s_client -connect test:443 -tls1
openssl s_client -connect test:443 -tls1_1
それに対する応答結果は以下で
$ openssl s_client -connect test:443 -tls1 ... New, TLSv1.0, Cipher is ECDHE-RSA-AES256-SHA Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1 Cipher : ECDHE-RSA-AES256-SHA Session-ID: XX Session-ID-ctx: Master-Key: XX PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: ... Start Time: xx Timeout : 7200 (sec) Verify return code: 18 (self signed certificate) Extended master secret: no ---
プロンプト入力待ちの中で存在するパスにGETを行うとHTMLが返ってきます。
GET / ....
ちなみに今回はopensslコマンドで確認していますがcurlでも以下のようなオプションを付与すればTLSのバージョン指定で打鍵可能です。
$ curl -s -v --tlsv1.1 https://test
設定変更
/etc/nginx/nginx.conf
に対して以下のようにssl_protocolsを明示的に指定します。
server { ssl on; listen 443 ssl default_server; server_name test; ssl_certificate "/etc/nginx/cert.crt"; ssl_certificate_key "/etc/nginx/cert.key"; ssl_protocols TLSv1.2; root /usr/share/nginx/html; location / { index index.html index.htm; }
この状態でnginxを再起動すると
# systemctl restart nginx
それからは以下のようにopensslで繋ぎに行くと以下のようなメッセージが出た後に遮断されます。
$ openssl s_client -connect test:443 -tls1 ... New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1 Cipher : 0000 Session-ID: Session-ID-ctx: Master-Key: PSK identity: None PSK identity hint: None SRP username: None Start Time: ... Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no ---
ちなみに許容されているTLS1.2ではもちろん正常に接続できます。
$ openssl s_client -connect test:443 -tls1_2
終わりに
設定を入れる前は以下のようにsupportedとなっていますが設定後はNOT supportedとなっています。
New, TLSv1.0, Cipher is ECDHE-RSA-AES256-SHA Server public key is 2048 bit Secure Renegotiation IS supported
Nginx側に設定を入れた後の確認含めて、ご参考になれば幸いです。