当服务器提供 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 来强制执行。不幸的是,这在我们的生产环境中不是一个选项。
我的问题是上面的结论是否正确;客户端是否应该在没有证书的情况下进行响应而不是关闭连接?
如果是这样,我看到几个选项:
- 创建客户端证书并安装在每个客户端设备上
- 在服务器上打开一个单独的端口,只允许 TLS 1.0 专门用于此客户端。
- 向供应商提供客户端设备的支持票,希望他们能修好或有解决方案(有疑问)
我们倾向于选项 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.
正如我上面所说,我怀疑它是否真的会修复它。我认为您应该使用供应商的支持渠道。
我们有一个相对较旧的硬件 运行 客户端应用程序需要通过 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 来强制执行。不幸的是,这在我们的生产环境中不是一个选项。
我的问题是上面的结论是否正确;客户端是否应该在没有证书的情况下进行响应而不是关闭连接?
如果是这样,我看到几个选项:
- 创建客户端证书并安装在每个客户端设备上
- 在服务器上打开一个单独的端口,只允许 TLS 1.0 专门用于此客户端。
- 向供应商提供客户端设备的支持票,希望他们能修好或有解决方案(有疑问)
我们倾向于选项 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.
正如我上面所说,我怀疑它是否真的会修复它。我认为您应该使用供应商的支持渠道。