Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相互SSL:不支持的\u证书和客户端证书格式_Java_Ssl_Ssl Certificate_Csr_Mutual Authentication - Fatal编程技术网

Java 相互SSL:不支持的\u证书和客户端证书格式

Java 相互SSL:不支持的\u证书和客户端证书格式,java,ssl,ssl-certificate,csr,mutual-authentication,Java,Ssl,Ssl Certificate,Csr,Mutual Authentication,我被告知使用双向身份验证连接到客户的服务器。服务器身份验证工作顺利,但我们在获得客户端身份验证方面遇到了巨大的困难。让我试着解释一下我们的烦恼 不久前,我的公司在GeoTrust购买了一个证书,这个证书应该是完全有效的,可以用作我们的客户证书。显然,客户没有将此GeoTrust证书适当地添加到他们的信任库中,因此每次尝试连接到他们的服务器时,我们都会在SSL握手日志中看到错误unknown\u ca 相反,客户要求我们向他们发送一个证书签名请求(csr),我们收到了一个根证书以及一个应该用作客户

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

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

相反,客户要求我们向他们发送一个证书签名请求(csr),我们收到了一个根证书以及一个应该用作客户端证书的证书。在相应地更新了密钥库之后,我们现在看到SSL握手日志中出现了错误不支持的\u证书。仔细查看客户签名的客户机证书可以发现,新证书显式具有服务器身份验证扩展,但没有客户机身份验证扩展。我发现不受支持的\u证书与丢失的客户端身份验证扩展之间的相关性非常明显,但客户拒绝接受丢失的客户端身份验证作为有效解释(因此拒绝为我们创建新的且正确扩展的客户端证书)。这就是客户所说的:

客户向我发送了一个屏幕截图,显示其日志中未返回任何证书,并声称此日志条目表示我以错误格式通过网络传递客户端证书:

为了加强其关于我以错误格式提交客户端证书的主张,客户向我发送了以下TCP转储屏幕快照,其中已圈出一个pkcs

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

为了排除是keystore.jkstruststore.jks被格式不正确的Java代码使用,我尝试使用OpenSSL命令连接到它们的服务器:

openssl s_客户端-CAfile caroot.cer-cert client.cer-key client.key-connect:

执行此OpenSSL命令将导致完全相同的不受支持的\u证书错误


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

当然,OpenSSL
s\u客户端将以正确的格式传输证书(否则在连接到服务器之前将失败)。让我们检查为定义的错误警报

还有几个警报,但这是最有趣的两个。由此,我们可以推断,由于格式不正确等原因导致的证书解析失败将导致
错误的\u证书
,而
不受支持的证书
可能会在不合适的密钥使用信息等情况下返回

如果您的客户需要进一步的证据,您可以将
s_服务器(1)
程序与
s_客户端
一起使用,以显示在此设置中客户端证书以相同的方式被拒绝

客户向我发送了一张从其日志返回的无证书的屏幕截图,并声称此日志条目意味着我以错误的格式通过网络传递客户端证书

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

没有返回任何证书。如果不返回证书,则会发生这种情况。这是因为SSL软件没有找到由服务器在
CertificateRequest
消息中指定的证书类型或可信签名者之一签名的证书

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

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

  • 他们不信任自己的根证书,因此他们没有在
    CertificateRequest
    消息中作为受信任的签名者发送自己的根CA,或者没有包含其类型
  • 我的钱在(1)和(2)上,但客户在你的证书上签字的整个过程都是荒谬的。如果他的信任库无法识别一个已识别的CA,这就是他们要解决的问题,而不是更改为其他签名者,这只会转移问题。例如,你信任他们的签名人吗?我的意思不仅仅是在信任商店的意义上,而是在公司安全的意义上

    如果是(2),这意味着客户的软件没有识别他自己颁发的证书,所以我不明白你为什么需要参与其中

    客户声称提交的客户证书格式错误,对此有何评论

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

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

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

    我对下面的TCP转储屏幕截图没有信心
    bad_certificate
       A certificate was corrupt, contained signatures that did not
       verify correctly, etc.
    
    unsupported_certificate
       A certificate was of an unsupported type.