我有一个NGINX作为我们网站的反向代理,工作得很好。 对于那些需要ssl的站点,我跟着raymii.org来确保尽可能强大的SSLLabs评分。 其中一个站点需要符合PCI DSS标准,但基于最新的TrustWave扫描,现在由于启用了TLS 1.0而失败。
在nginx.conf的http层次上,我有:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
对于我具有的特定服务器:
ssl_protocols TLSv1.1 TLSv1.2;
我已经改变了密码,把事情从http级别移到了每个ssl站点服务器上,但不pipe什么时候运行:
openssl s_client -connect www.example.com:443 -tls1
我获得了TLS 1.0的有效连接。 SSLLabs将网站的nginx设置为A,但是使用TLS 1.0,所以我相信我的设置的其余部分是正确的,它不会closuresTLS 1.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
这里的问题是TLS协商的Server name indication部分是在连接本身被协商之后完成的。 协议在连接协商期间进行协商。
如果您将该虚拟主机configuration为没有与其关联的其他虚拟主机的服务器上的IP地址,则可以为该虚拟主机强制执行TLS v1.0。 因此nginx会根据IP地址知道不允许使用TLS v 1.0。
去找一个你想用作你的“默认”SSL协商模板的服务器块。 find你的听线
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版本时具有configuration。 缺点是每个端口只能有一个默认的服务器。 所以有一些启用了TLSv1的虚拟域以及其他一些被禁用的虚拟域是不行的。
如果它仍然是重要的,我禁用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/nul
你应该得到这样的东西:
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) ---