当服务器提供 CA 列表时,客户端 TLS 1.0 握手失败

Client Failing TLS 1.0 Handshake when CA List provided by Server

我们有一个相对较旧的硬件 运行 客户端应用程序需要通过 TLS 1.0 进行 Web 服务调用。

服务器有许多不同的客户端,因此它支持 TLS 1.0、1.1 和 1.2。因此,当服务器发送它的证书时,它也会与 CA 列表一起发送。服务器已设置,以便客户端可以选择提供证书,但这不是必需的。问题是,一旦客户端看到 CA 列表,它就会发回 FIN/ACK(关闭连接)。

这似乎是不正确的行为。根据 TLS 1.0 RFC https://www.rfc-editor.org/rfc/rfc2246#section-7.4.2

Note that a client may send no certificates if it does not have an appropriate certificate to send in response to the server's authentication request.

据推测,客户端正在查看 CA 列表,并假设它需要出示证书,但由于没有证书而彻底失败。客户端在没有提供 CA 列表时工作,我们可以通过在服务器上禁用 TLS 1.1 和 1.2 来强制执行。不幸的是,这在我们的生产环境中不是一个选项。

我的问题是上面的结论是否正确;客户端是否应该在没有证书的情况下进行响应而不是关闭连接?

如果是这样,我看到几个选项:

我们倾向于选项 2,因为它是我们最容易实施的解决方案。如果有人有任何其他方法可以帮助我们解决问题,将不胜感激。

My question is whether the above conclusion is correct; should the client instead be responding with no certificate instead of closing the connection?

是的。见 RFC 2246 #7.4.6 Client Certificate:

This message is only sent if the server requests a certificate. If no suitable certificate is available, the client should send a certificate message containing no certificates.

非常清楚。

If so, I see a few options:

  • Create client certificate and install on each client device

可能是最好的解决方案,但也可能是最昂贵的。

  • Open a separate port on the Server to only allow TLS 1.0 to be used specifically for this client.

我不明白为什么有必要这样做。服务器应该已经从第一条 ClientHello 消息中知道客户端正在使用 TLS 1.0。我怀疑这个选项会改变什么。如果是这样,则表示服务器有问题。

  • Support ticket to vendor for client device and hope they get it fixed or have a solution (doubt it)

我肯定会那样做,不管你做什么。供应商违反了 RFC 2256,因此发布了一种无用的产品,并且可能不符合其自己的规范(毫无疑问会提到 TLS 1.0)。

We are leaning towards option 2, as it's the easiest solution for us to implement.

正如我上面所说,我怀疑它是否真的会修复它。我认为您应该使用供应商的支持渠道。