(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Nginx/Linux】TLS1/TLS1.1を用いた接続を拒否する設定をopensslで確認する

スポンサーリンク

はじめに

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側に設定を入れた後の確認含めて、ご参考になれば幸いです。