我们有一个相对较旧的硬件运行客户端应用程序,需要通过TLS 1.0进行Web服务调用。
服务器有许多不同的客户端,因此它支持TLS 1.0,1.1和1.2。因此,当服务器发送它的证书时,它也会与CA的列表一起发送。设置服务器以便客户端可以选择提供证书,但这不是必需的。问题是,一旦客户端看到CA的列表,它就会发回FIN / ACK(关闭连接)。
这似乎是不正确的行为。根据TLS 1.0 RFC http://tools.ietf.org/html/rfc2246#section-7.4.2
请注意,客户可以 如果没有合适的证书,则不发送证书 发送以响应服务器的身份验证请求。
据推测,客户端正在查看CA的列表,并假设它需要提供证书并且完全失败,因为它没有证书。客户端在没有提供CA列表时工作,我们可以通过在服务器上禁用TLS 1.1和1.2来强制执行。不幸的是,这在我们的生产环境中不是一种选择。
我的问题是上述结论是否正确;客户端应该没有证书而不是关闭连接吗?
如果是这样,我会看到几个选项:
我们倾向于选项2,因为这是我们实施的最简单的解决方案。如果有人有任何其他方式让我们解决问题,我们将不胜感激。
答案 0 :(得分:2)
我的问题是上述结论是否正确;客户端应该没有证书而不是关闭连接吗?
是。见RFC 2246 #7.4.6 Client Certificate:
此消息仅在发送时发送 服务器请求证书。如果没有合适的证书 可用,客户端应发送证书消息 不含证书。
完全清楚。
如果是这样,我会看到几个选项:
- 创建客户端证书并在每个客户端设备上安装
可能是最好的解决方案,但它也是最昂贵的。
- 在服务器上打开一个单独的端口,仅允许专门为此客户端使用TLS 1.0。
我不明白为什么这是必要的。服务器应该已经知道客户端正在从第一个ClientHello消息中说出TLS 1.0。我怀疑这个选项会改变什么。如果是这样,则表明服务器有问题。
- 支持客户端设备供应商的票,希望他们修复它或有解决方案(疑问)
无论你做什么,我都会这样做。供应商违反了RFC 2256,因此发布了一个无用的产品,并且可能不符合自己的规范(毫无疑问会提到TLS 1.0)。
我们倾向于选项2,因为这是我们实施的最简单的解决方案。
正如我上面所说的,我怀疑它是否会真正解决它。我认为您应该参与供应商的支持渠道。