在 NGINX 中禁用 TLS 1.0

在 NGINX 中禁用 TLS 1.0

我有一个 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 站点服务器,但无论我运行时如何:

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

我获得了有效的 TLS 1.0 连接。SSLLabs 将网站的 nginx 设置作为A但是使用 TLS 1.0,所以我相信我的其余设置是正确的,它只是不会关闭 TLS 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

答案1

这里的问题是,Server name indicationTLS 协商部分是在连接本身协商完成后进行的。而协议是在连接协商期间协商的。

如果您将该虚拟主机配置为服务器上没有其他虚拟主机关联的 IP 地址,则可能可以对该虚拟主机强制执行 TLS v1.0。因此,nginx 会根据 IP 地址知道不允许使用 TLS v 1.0。

答案2

找到您想要用作“默认” 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 版本时进行配置。缺点是每个端口只能有一个默认服务器。因此,让一些虚拟域启用 TLSv1 而让其他虚拟域禁用 TLSv1 是行不通的。

答案3

我在 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)
---

相关内容