NGINXでTLS 1.0を無効にします


22

サイトのリバースプロキシとして機能するNGINXがあり、非常にうまく機能しています。サイトの必要性のSSLは、私が続くことraymii.orgを SSLLabsの強いが、可能な限りスコアとして持っていることを確認します。サイトの1つはPCI DSSに準拠する必要がありますが、TLS 1.0が有効になっているため、最新のTrustWaveスキャンに基づいて失敗しています。

私が持っているnginx.confのhttpレベルで:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

特定のサーバーについて:

ssl_protocols TLSv1.1 TLSv1.2;

私は暗号を変更し、httpレベルから各sslサイトサーバーに物事を移動しましたが、実行するときは何に関係なく:

openssl s_client -connect www.example.com:443 -tls1

TLS 1.0の有効な接続を取得します。SSLLabsはサイトのnginxセットアップをAとして設定しますが、TLS 1.0を使用するため、残りのセットアップは正しいと考えています。TLS1.0はオフになりません。

私が行方不明になる可能性についての考え?

openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Thu Jun 11 15:28:12 UTC 2015
platform: debian-amd64

nginx -v
nginx version: nginx/1.8.0

1
6月30日、2016年まではTLS 1.0を削除するために必須ではないことに注意してください
マイケル・ハンプトン

回答:


12

ここでの問題はServer name indication、TLSネゴシエーションの一部が、接続自体がネゴシエートされた後に行われることです。また、プロトコルは接続ネゴシエーション中にネゴシエートされます。

他の仮想ホストが関連付けられていないサーバー上のIPアドレスにその仮想ホストを構成すると、その仮想ホストにTLS v1.0を強制しないことが可能になる場合があります。したがって、nginxはIPアドレスに基づいて、TLS v 1.0が許可されていないことを認識します。


ありがとう。現時点では、それをテストするための予備のIPがないため、これを回避する方法はないと考えています。
ショーンC.

1
Server Name IndicationTLSの一部ですClientHello。クライアントによって送信される最初のメッセージにあり、後でネゴシエートされません。Nginxには設計上の欠陥があるようです。接続を受け入れてから、仮想ホストにその正誤を問わず転送するようです。代わりに、nginxはサーバー名を解析し、仮想ホストに問い合わせて、仮想ホストの要件を満たしていない場合は接続を拒否する必要があります。TLS 1.0は時々疑わしいので、設計上の欠陥はおそらくCVEに値します。状況によっては明らかにC&A違反です。

コメントありがとうございます。これが本当に実際の設計上の欠陥である場合、これは興味深いです。
テロキルカネン16年

1
新しいnginxバージョンでも2019年に変更されませんか?
ロブシュ

18

「デフォルト」のSSLネゴシエーションテンプレートとして使用するサーバーブロックを見つけます。リッスンラインを見つける

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

default_server行末に追加します

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

これにより、nginxは、使用するTLSバージョンをネゴシエートしているときに構成を持つことができます。欠点は、ポートごとに1つのデフォルトサーバーしか持てないことです。そのため、TLSv1が有効になっている仮想ドメインと無効になっている仮想ドメインを持っていることはありません。


それは、ssl_protocollsが効果を発揮する場所が1つしかないことを意味しますか?default_server宣言があるサーバー構成内で?この構成がネゴシエーション中に使用される場合、別の構成内のssl_protocolls設定は効果がありませんか?
ロブシュ

4

nginxバージョン1.8.1でTLSv1を無効にしました。opensslを1.0.1gまたは1.0.1hバージョンに更新する必要があります。次に、ssl_protocolsディレクティブから「TLSv1」を削除するだけです。

ssl_protocols TLSv1.1 TLSv1.2

次に、コマンドによってTLSv1を介した接続を確認します。

openssl s_client -tls1 -connect example.com:443 < /dev/null

そのようなものを取得する必要があります。

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
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: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1474531027
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

1
人々は通常、ホスト環境にいるときにOpenSSLのバージョンを置き換えることはできません。サーバーオペレーターはサーバーの構成を制御します。仮想サーバーをレンタルしているウェブサイト運営者ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.