java - 确定以两种方式 ssl 使用哪个证书

标签 java tomcat ssl https

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

我们希望返回带有 CN 的证书:

b2b-test

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

Unable to find valid certificate path to requested target

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

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

目前服务器正在发回证书

b2b-a

证书链显示:

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

该服务的 URL 是:

https://b2b-a/service

如果我像 ssl 一样配置它,并将服务器证书放入我们的 cacerts,那么它会获取他们的证书并使握手失败(我假设是因为它期待我们的证书而不是他们的证书,因为它是一个双向设置)。

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

最佳答案

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

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

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

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

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

关于java - 确定以两种方式 ssl 使用哪个证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005684/

相关文章:

ssl - 在 Windows 上生成 cert.pem 和 key.pem

java - 将音频录制为 Android 服务并使用计时器停止它。录音时长不一,服务似乎没有停止

postgresql - 地理服务器问题

java - android中的计算器多操作数

java - Tomcat 更新 context.xml 但不应该

tomcat - 我们可以在tomcat中部署两个同名的war文件吗?

Apache Jboss SSL 身份验证

google-chrome - 无法让 Chrome 版本 42 接受本地主机证书

java - 为什么我的阵列不工作?

java - 在外部 API 中使用检查异常是个好主意吗?