确定以双向ssl使用哪个证书

时间:2014-09-23 22:27:12

标签: java tomcat ssl https

我在向Web服务调用期间将证书(客户端)发送到另一台服务器时遇到问题。

我们希望通过CN返回证书:

b2b-test

然而,无论何时我们收到服务器证书并尝试发送我们自己的证书,我们都会得到:

Unable to find valid certificate path to requested target

根据我的理解,如果我将证书b2b-test放在我们的密钥库jre / lib / security / cacerts中,那么当收到服务器请求时,它应该发送相应的证书。

客户端如何知道它应该发送到服务器的密钥库中的哪个密钥?我应该在我的请求期间指定要发送的确切证书,还是足以让它在密钥库中?

目前服务器正在发回证书

b2b-a

证书链显示:

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=b2b-a, OU=Web Technologies

该服务的URL为:

https://b2b-a/service

如果我将它配置为单向ssl,并将服务器证书放入我们的cacerts,那么它就会拿起他们的证书并且不通过握手(我假设是因为它期待我们的证书而不是他们的证书,因为它是一个双向设置)。

我在这里有点难过。对我所说的内容的任何澄清都非常感谢。

2 个答案:

答案 0 :(得分:2)

当一方通过另一方不信任链中任何证书的证书时,通常会发生“无法找到所请求目标的有效证书路径”错误。您通常(总是?)在接收证书的一方(缺少信任库的一方)看到错误消息。

如果您是客户端并且他们是服务器,单向SSL会将他们的证书发送给您,您将验证它(确保主机名与证书中的内容匹配),但它会不向您发送任何证书,也不会进行任何验证。

您需要确保配置的信任库包含b2b-a证书或用于签名的证书(但该证书似乎没有任何根CA,因此您'坚持直接导入证书本身)。所以,是的,你想做你在帖子中写的内容,并将他们的证书放入你的cacerts。此外,您还需要确保b2b-a服务信任您发送的证书(或用于签署证书的根CA,如果有的话),因此您需要将证书放入其中cacerts也是,或做同等的事情。

请注意,将证书放在cacerts(或在信任库JKS中)不会向任何人发送任何证书;任何信任库仅使用 ,以允许您验证您信任其他人提供给您的证书,因为您信任该证书,或者您信任用于签署证书的CA证书。没有从cacerts目录中挑选证书以发送到另一台计算机。

如果您使用的是JKS而不是JRE目录(这通常是一个更好的主意,因为您可以为流程指定一组不同的可信证书,而无需更改JRE中运行Java项目的任何人的默认设置),可以使用相同的JKS作为密钥库和信任库(您只需为密钥库和信任库属性提供相同的文件名和密码),或者您可以拥有两个单独的文件;任何一种方法都可行。

答案 1 :(得分:1)

  

根据我的理解,如果我将证书b2b-test放在我们的密钥库jre / lib / security / cacerts中,那么当收到服务器请求时,它应该发送相应的证书。

当然不是。那是一个信任库。可信证书的来源。不要乱用它。它不是用于您需要的目的,并且无论如何它都会在每个Java dot版本中更新,这会破坏您的更改。

您自己的证书和私钥/公钥对应该放在您自己的文件中, keystore ,由javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword系统定义为JSSE属性,或者通过JSSE参考指南中描述的更复杂的方法。

密钥库是一个包含私钥的珍贵机密文件。保护并保护它。私钥泄露会危及您的安全和身份。