首页 > 解决方案 > 客户端需要哪些 SSL 工件用于 java 中的相互握手

问题描述

我正在开发一个需要使用使用 SSL 相互握手的 Rest API 的应用程序。Rest 服务提供商共享了一个证书,即使他们不确定是否正确,并进一步调查。我已经查看了有关 SSL 配置和通信的网络,但是,实际上我仍然有疑问。

我已经阅读客户端应该使用服务器证书(公钥)和他们自己的私钥来提出请求。如果我的理解正确,以下是我的问题

  1. 我如何为此目的制作我的私钥?我尝试使用 keytool 生成密钥库,默认情况下会创建一个我认为的私钥。这是正确的方法吗?

  2. 我应该获得服务器证书/公钥吗?

  3. 如果上述问题的答案是肯定的,那么我是否应该将该证书导入我创建的密钥库,然后使用密钥库进行通信?

编辑:我只想在这里添加更多细节。我正在使用的应用程序(客户端)已经投入生产,并且也使用 SSL。那么,我可以通过在浏览器中点击应用程序来获取我的应用程序的公钥/证书吗?我发现我的应用程序的 CA 以及托管其余 api 的应用程序是相同的。我只是在想我是否真的需要创建一个密钥对并在我的情况下由 CA 签名或利用任何现有的?

标签: javarestsslclient-certificates

解决方案


因此,您有一个想要与 SSL 端点通信的 JVM。几件事需要到位:

  • 您的 JVM 必须“信任”服务器
  • 您的 JVM 必须提供服务器信任的身份(证书)
  • 至少一种加密算法必须匹配

在您的 JVM 密钥库中,您可以保存您的身份:这通常是一个 JKS,并且应该有一个“PrivateKeyEntry”。这个 PrivateKeyEntry 确实是您的密钥 + 签名证书的 P12 导入

该文件作为 KeyStore 系统属性(并且您需要提供相应的密码......那是另一个蠕虫罐头)

为了让您信任另一方(或多方),您必须信任他们。这意味着您要么将他们的实际“证书”导入您的 TrustStore JKS,要么导入相应的 CA 证书(颁发者证书)

该文件应作为 JVM 系统属性中的 TrustStore 文件进入(此处类似密码故事)

注意:没有什么能阻止您使用相同的 JKS 文件作为密钥库和信任库。您只需在同一个 JKS 文件中导入您的 P12 和 Trusted 证书条目。

现在,当您启动 JVM 并且客户端进行 REST 调用时:

  1. 服务器将提供其身份
  2. 您的客户将提供其身份(这是在您的 java 密钥库中设置的)
  3. 您将查找 Server 提供的身份并检查您的 TrustStore。在这里,您将找到相同的主题条目或发行人的主题条目
  4. 服务器对你的身份做同样的事情
  5. 双方相互信任。他们现在协商一个共同的密码
  6. 使用 Cipher 加密通道

注意:以上步骤是对 SSL-handshake 的粗略解释。如果您需要获得确切的详细信息,可以在 wiki 上查找 SSL 握手。

现在关于您的问题:

如何生成私钥?

  • 使用 Keytool 这将生成一个自签名密钥
  • 如果您没有 CA,那么您需要提取此证书并将其发送到您的服务器(否则他们可以添加 CA 证书或您的签名证书)

我应该获得服务器证书/公钥吗?

是的。如果您关心信任服务器(通常是个好主意)

如果上述问题的答案是肯定的,那么我是否应该将该证书导入我创建的密钥库,然后使用密钥库进行通信?

通常将您的密钥库与您的信任库分开是一个很好的做法。我建议将您的 P12(密钥 + 证书)放在您的密钥库中,并将服务器的证书/公钥放在您的信任库中

希望这可以帮助 :)


推荐阅读