我有一个场景,一些旧客户端只能支持 MD5 和 SHA1 签名。显然,这些通常被认为已弃用,但我仍然需要支持它们。无法升级这些客户端(固件更新不再发布,理想情况下我想砍掉所有这些设备,但这也不可行)。
假设我仍然可以获得 MD5 或 SHA1 签名证书。
是否可以在任何(https)服务器上根据客户端在首次连接时发送的 ClientHello 块中包含的传入 TLS 版本提供不同的证书?
我相信应该可以通过编写一个小的“代理”来读取从客户端传入的前几个字节,然后在最坏的情况下将连接拼接到服务不同请求的备用端口,但如果可能的话,我更愿意如果存在支持此类功能的现有 Web 服务器,请避免这种情况。
旁白:据我了解,SSL/TLS 协议确实包含针对降级攻击的保护,因此如果服务器支持 1.2 并且客户端也支持 1.2,那么如果降级到 1.0,那么连接应该终止(如果是主动人为-中间攻击)。我相信这应该可以降低提供 MD5 或 SHA1 签名证书的风险,至少在仍然支持旧 SSL/TLS 版本的同时可以做到这一点。
我有一个非常相似的问题。 我不相信你会找到一个能满足你要求的服务器。 我也认为你应该停止寻找一个:
您不应依赖 MD5 或 SHA1 证书来保护任何连接。这些证书被认为是易受攻击的,因为存在有人可以伪造这些证书的风险。所有客户端现在都应该拒绝旧的 MD5 和 SHA1 证书。
您应该避免任何客户端在不安全的连接上与您的服务器通信。如果任何客户端或服务器无法升级,那么您应该将它们放在自己的安全沙箱中。
如何解决问题
和你一样,我支持无法升级的旧软件。无论有什么安全建议,我们都必须使用我们所拥有的东西。
我推荐stunnel。它作为一个独立的服务器运行,它转发它收到的所有连接:首先加密或解密它们。
要使用它,您最好将它安装在旧主机上。在旧软件上禁用 SSL 并将其配置为以未加密的方式连接到 stunnel,而不是使用(不安全的)加密方式连接到您的服务器:
如果不能将其安装在同一个盒子上,则将其安装在与旧主机牢固连接的新盒子上。那可能只是插入同一个开关的树莓派:
如果旧软件拒绝未加密连接,那么您可以再次使用 stunnel,充当提供旧 MD5 或 SHA1 证书的服务器。同样,这两者应该是物理连接的,因为您应该考虑与旧证书的连接,就像它是未加密的一样:
Nginx 及其 lua 扩展和它的 ssl 部分可以根据握手的开始选择要公开的证书,以及客户端发送的内容,
ClientHello
但可能不是您确切需要的内容(支持的算法列表)。完整文档位于https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md和https://github.com/openresty/lua-nginx-module/# ssl_certificate_by_lua_block
它指出:
您可以通过函数
raw_client_addr
和轻松访问客户端或服务器 IP(对于多宿主 IP)raw_server_addr
,以及客户端通过读取 SNI 部分尝试访问的主机名server_name
。根据文档,我看不到可以访问客户端 ClientHello 的其他部分,但是如果您可以根据 IP 区分您的客户端,或者如果您有两个单独的服务器名称,则您可能已经找到了上述解决方案可以绑定到特定的证书。阅读https://github.com/openresty/lua-nginx-module/blob/master/src/ngx_http_lua_ssl_certby.c我看不到访问客户端发送的密码套件列表的特定方法。然而,这段代码从 openssl 库中获取所有底层的“SSL”信息,所以我怀疑你想要的在技术上是可行的,但只需要编码。
现在还有两点:
1)“假设我仍然可以获得 MD5 或 SHA1 签名证书。”
这可能很难。至少来自默认操作下的公共已知 CA。CAB 论坛要求(https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.3.pdf)在第 38 页上有:
接着:
2)“据我了解,SSL/TLS 协议确实包含针对降级攻击的保护,因此如果服务器支持 1.2,而客户端也支持 1.2,那么如果降级到 1.0,那么连接应该终止(如果有活动的 man-中间攻击)。”
是的,但前提是使用 extension
TLS_FALLBACK_SCSV
,并且可能在现有会话期间禁止客户端重新协商。有关解释,请参阅https://crypto.stackexchange.com/questions/19673/how-does-tls-fallback-scsv-help#19674,但引用它的核心部分:https://en.wikipedia.org/wiki/Transport_Layer_Security上的维基百科页面也详细讨论了有关降级攻击的内容。
顺便说一句,这在 TLS 1.3 中得到了改进,引用了 4.1.3。来自 RFC8446 的服务器您好:
和