繁体   English   中英

相互SSL:unsupported_certificate和客户端证书格式

[英]Mutual SSL: unsupported_certificate and client certificate format

我被告知要使用双向身份验证连接到客户的服务器。 服务器身份验证工作正常,但是在设置客户端身份验证方面遇到了很大的麻烦。 让我尝试解释我们的麻烦。

不久前,我的公司在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错误。

如果有人可以帮助我了解我们是对的还是客户对的,我将不胜感激。 非常感谢。

当然,OpenSSL s_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一起使用,以表明在此设置中,客户端证书以相同的方式被拒绝。

该客户向我发送了从其日志返回的没有证书的屏幕快照,并声称此日志条目表示我以错误的格式通过网络传递了客户证书。

错误。 这就是说的意思。

没有返回证书。 发生这种情况时,呃,您不返回证书。 依次发生这种情况是因为您的SSL软件找不到由服务器在CertificateRequest消息中指定的一种证书类型或受信任的签名者签名的CertificateRequest

这又意味着两件事之一:

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

要么

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

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

如果是(2),则表示客户的软件无法识别他自己签发的证书,因此我根本不知道为什么您需要参与其中。

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

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

我在Google中找到了一个地方,提到如果客户端证书缺少“客户端身份验证”扩展名,则可能会出现没有证书返回的日志条目。

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

我也不对“下面的TCP转储截屏pkcs的屏幕快照”充满信心,除非首先有一个CertificateRequest ,然后紧接其上方的是Certificate消息。 如果全部正确,则客户似乎签发了不正确的证书。

您破坏它的任何指控都可以被取消,因为在两端都无法通过验证。 同样,当您使用Java而不是您自己的代码来执行此操作时,也可以轻视任何有关您的软件在传输过程中损坏它的指控。

所有这些都更加强烈地表明,您应该忘记客户签署证书,让他们解决GeoTrust根CA证书的原始问题。 这要简单得多,而且不需要您的参与。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM