在 NGINX 中禁用 TLS 1.0

Sha*_* C. 29 nginx pci-dss tls

我有一个 NGINX 作为我们网站的反向代理,并且运行良好。对于需要 ssl 的站点,我关注raymii.org以确保拥有尽可能高的 SSLLabs 分数。其中一个站点需要符合 PCI DSS,但基于最新的 TrustWave 扫描,由于启用了 TLS 1.0,现在失败。

在 nginx.conf 中的 http 级别我有:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Run Code Online (Sandbox Code Playgroud)

对于特定的服务器,我有:

ssl_protocols TLSv1.1 TLSv1.2;
Run Code Online (Sandbox Code Playgroud)

我已经更改了密码,将内容从 http 级别移到了每个 ssl 站点服务器,但无论何时运行:

openssl s_client -connect www.example.com:443 -tls1
Run Code Online (Sandbox Code Playgroud)

我获得了 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
Run Code Online (Sandbox Code Playgroud)

小智 21

找到一个你想用作“默认”ssl 协商模板的服务器块。找到你的聆听路线

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

并添加default_server到行尾

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这允许 nginx 在协商使用哪个 TLS 版本时进行配置。缺点是每个端口只能有一个默认服务器。因此,让一些虚拟域启用 TLSv1 而其他虚拟域禁用它是不行的。


Ter*_*nen 14

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

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

  • ***`Server Name Indication`*** 是 TLS `ClientHello` 的一部分。它在客户端发送的第一条消息中,之后不进行协商。听起来更像是 Nginx 有一个设计缺陷。听起来它接受了连接,然后转发到虚拟主机,无论它是对还是错。相反,nginx 应该解析服务器名称,咨询虚拟主机,如果无法满足虚拟主机的要求,则拒绝连接。由于 TLS 1.0 有时存在问题,因此设计缺陷可能是 CVE 值得的。在某些情况下,这显然违反了 C&A。 (2认同)

小智 6

我在 nginx 版本 1.8.1 上禁用了 TLSv1。您需要将 openssl 更新到 1.0.1g 或 1.0.1h 版本。然后简单地从 ssl_protocols 指令中删除“TLSv1”:

ssl_protocols TLSv1.1 TLSv1.2
Run Code Online (Sandbox Code Playgroud)

然后通过命令检查通过 TLSv1 的连接:

openssl s_client -tls1 -connect example.com:443 < /dev/null
Run Code Online (Sandbox Code Playgroud)

你应该得到这样的东西:

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)
---
Run Code Online (Sandbox Code Playgroud)