2

我被告知使用双向身份验证连接到客户的服务器。服务器身份验证工作顺利,但我们在获取客户端身份验证时遇到了巨大的麻烦。让我试着解释一下我们的麻烦。

前段时间我的公司在 GeoTrust 购买了一个证书,该证书应该完全有效地用作我们的客户证书。显然,客户没有设法将此 GeoTrust 证书适当地添加到他们的信任库中,因此每次我们尝试连接到他们的服务器时,我们都会在 SSL 握手日志中看到错误unknown_ca 。

相反,客户要求我们向他们发送证书签名请求 (csr),我们收到了根证书以及应该用作我们的客户端证书的证书。在相应地更新了我们的密钥库之后,我们现在在我们的 SSL 握手日志中看到了错误unsupported_certificate 。仔细查看客户签名的客户端证书会发现,新证书明确具有服务器身份验证扩展,但没有客户端身份验证扩展。我发现unsupported_certificate和缺少的客户端身份验证扩展之间的相关性非常明显,但是客户拒绝接受缺少的客户端身份验证作为有效解释(因此拒绝为我们创建新的和适当扩展的客户端证书)。这是客户的争论:

客户给我发了一张他的日志没有返回证书的屏幕截图,并声称这个日志条目意味着我以错误的格式通过网络传递了客户端证书:

在此处输入图像描述

为了加强他关于我以错误格式提交客户端证书的断言,客户向我发送了以下 TCP 转储屏幕截图,其中pkcs已被圈出:

在此处输入图像描述

在我看来,pkcs-9-at-emailAddress只是在证书中包含电子邮件地址信息的标准方式,与以错误格式提交的证书无关。此外,我在 Google 中找到了一个地方,其中提到在客户端证书缺少客户端身份验证扩展的情况下,可能会出现无证书返回日志条目。

为了排除我们的 Java 代码使用的keystore.jkstruststore.jks格式错误,我尝试仅使用 OpenSSL 命令连接到他们的服务器:

openssl s_client -CAfile caroot.cer -cert client.cer -key client.key -connect <host>:<port>

执行此 OpenSSL 命令会导致完全相同的unsupported_certificate错误。

如果有人能帮助我了解我们是否正确或客户是否正确,我将不胜感激。非常感谢。

4

2 回答 2

4

当然,OpenSSLs_client将以正确的格式传输证书(否则在连接到服务器之前它会失败)。让我们检查为TLS 1.2 (RFC 5246)定义的错误警报

bad_certificate
   A certificate was corrupt, contained signatures that did not
   verify correctly, etc.

unsupported_certificate
   A certificate was of an unsupported type.

还有几个警报,但这是最有趣的两个。由此我们可以推断出解析证书失败(例如由于格式不正确)将导致bad_certificate,并且在不合适的密钥使用信息unsupported certificate等情况下可能会返回。

如果您的客户需要进一步的证据,您可以使用该s_server(1)程序s_client来证明在此设置中客户端证书以相同的方式被拒绝。

于 2015-03-29T22:45:28.650 回答
2

客户给我发了一张他的日志没有返回证书的屏幕截图,并声称这个日志条目意味着我以错误的格式通过网络传递了客户端证书。

错误的。它的意思正是它所说的。

没有返回任何证书。当您不返回证书时,就会发生这种情况。这反过来又会发生,因为您的 SSL 软件没有找到由服务器在CertificateRequest消息中指定的证书类型或受信任的签名者之一签名的证书。

这反过来意味着两件事之一:

  1. 您没有在密钥库中正确安装签名证书。执行此操作的步骤是 (1) 使用-trustcacerts选项将他们提供的根证书安装到密钥库中,以及 (2)使用您在生成密钥对和 CSR 时使用的相同别名安装签名证书。

或者

  1. 他们不信任自己的根证书,因此他们没有将自己的根 CA 作为受信任的签名者发送到CertificateRequest消息中,或者没有包含其类型。

我的钱在 (1) 和 (2) 上,但是客户签署您的证书的整个业务都是荒谬的。如果他的信任库不能识别一个公认的 CA,那就是他们要解决的问题,而不是更改为不同的签名者,这只会解决问题。例如,您是否信任他们的签名者?我的意思不仅仅是在信任库的意义上,而是在企业安全意义上?

如果是(2),则意味着客户的软件无法识别他自己颁发的证书,所以我完全不明白您为什么需要参与其中。

对客户关于提交格式错误的客户证书的索赔有何评论?

我的评论是,这并不能激发信心。

我在 Google 中找到了一个地方,其中提到在客户端证书缺少客户端身份验证扩展的情况下,可能会出现无证书返回日志条目。

换句话说,他们没有正确签名。

我对“以下 TCP 转储屏幕截图(其中 pkcs 已被圈出)”也没有任何信心,除非首先是 a CertificateRequest,然后是Certificate紧邻上方的消息。如果一切都是真的,那么客户似乎签发了不正确的证书。

任何关于您损坏它的指控都可以打折扣,因为它在两端都无法验证。同样,任何关于您的软件在传输过程中损坏它的指控也可以打折扣,因为您使用的是 Java,而不是您自己的代码来执行此操作。

所有这一切只会更加强烈地表明,您应该忘记客户签署证书并让他们解决 GeoTrust 根 CA 证书的原始问题。这要简单得多,而且不涉及您。

于 2015-03-29T23:57:38.417 回答