我被告知使用双向身份验证连接到客户的服务器。服务器身份验证工作顺利,但我们在获取客户端身份验证时遇到了巨大的麻烦。让我试着解释一下我们的麻烦。
前段时间我的公司在 GeoTrust 购买了一个证书,该证书应该完全有效地用作我们的客户证书。显然,客户没有设法将此 GeoTrust 证书适当地添加到他们的信任库中,因此每次我们尝试连接到他们的服务器时,我们都会在 SSL 握手日志中看到错误unknown_ca 。
相反,客户要求我们向他们发送证书签名请求 (csr),我们收到了根证书以及应该用作我们的客户端证书的证书。在相应地更新了我们的密钥库之后,我们现在在我们的 SSL 握手日志中看到了错误unsupported_certificate 。仔细查看客户签名的客户端证书会发现,新证书明确具有服务器身份验证扩展,但没有客户端身份验证扩展。我发现unsupported_certificate和缺少的客户端身份验证扩展之间的相关性非常明显,但是客户拒绝接受缺少的客户端身份验证作为有效解释(因此拒绝为我们创建新的和适当扩展的客户端证书)。这是客户的争论:
客户给我发了一张他的日志没有返回证书的屏幕截图,并声称这个日志条目意味着我以错误的格式通过网络传递了客户端证书:
为了加强他关于我以错误格式提交客户端证书的断言,客户向我发送了以下 TCP 转储屏幕截图,其中pkcs已被圈出:
在我看来,pkcs-9-at-emailAddress只是在证书中包含电子邮件地址信息的标准方式,与以错误格式提交的证书无关。此外,我在 Google 中找到了一个地方,其中提到在客户端证书缺少客户端身份验证扩展的情况下,可能会出现无证书返回日志条目。
为了排除我们的 Java 代码使用的keystore.jks和truststore.jks格式错误,我尝试仅使用 OpenSSL 命令连接到他们的服务器:
openssl s_client -CAfile caroot.cer -cert client.cer -key client.key -connect <host>:<port>
执行此 OpenSSL 命令会导致完全相同的unsupported_certificate错误。
如果有人能帮助我了解我们是否正确或客户是否正确,我将不胜感激。非常感谢。