TLS 客户端身份验证

TLS client authentication

TLS(v1.1、1.2 等)或 X.509 标准是否规定了客户端和服务器需要如何协商客户端身份验证证书?

具体来说,我正在处理服务器在其证书请求消息中发送一堆(大约五个)证书颁发机构的情况,如下所示:

*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
<CN=AA, DC=BB, DC=cc, DC=dd>
<CN=EE, DC=FF, DC=gg, DC=hh>
<CN=II, DC=JJ, DC=kk, DC=ll>
<CN=MM, DC=NN, DC=oo, DC=pp>

客户端密钥库有多个客户端证书与从服务器接收的这些证书颁发机构之一匹配(由其颁发)。

我看到我的客户端选择并使用密钥库中与服务器的受信任 CA 匹配的第一个证书(在众多证书中)。但是,服务器不会接受此证书。服务器将接受的证书存在于客户端密钥库中,但它不是符合服务器证书请求标准的证书列表中的第一个。服务器终止连接并且不发送任何警报。

现在我有两个问题:

  1. 我的客户端或服务器是否有问题?

  2. 关于客户端-服务器在放弃连接之前尝试所有匹配的客户端证书,TLS 规范有什么要说的吗?

万一 TLS 规范对此只字未提 - 通常如何最好地解决这个问题?向客户端添加智能(例如,通过指定别名或其他此类选择机制)是解决此问题的唯一方法吗?为什么 TLS 协议不能自己处理这个问题?

我已经通读了 TLS 规范以及我可以在网上搜索到的任何 X.509 信息(诚然不是详尽的),但我没有得到这方面的明确信息。

Is either my client or the server misbehaving?

根据您的描述,服务器请求由特定 CA 签名的证书,客户端发送此类证书,但服务器随后不接受它。原因可能是证书错误、签名不安全、过期、吊销或类似情况,在这种情况下,客户端不应该发送它。或者可能是服务器不接受完全有效的证书是错误的。从你的描述中无法判断是哪一种情况。

Do TLS specifications have anything to say about Client-Server trying out all the matching client certificates before giving up on the connection?

不,它希望客户端在第一次尝试时发送符合服务器要求的有效证书,并希望服务器接受此有效证书。客户端的一个常见行为是询问用户应该使用哪个证书,如果多个证书符合服务器的广告要求。