客户端需要在Java端使用哪些SSL构件进行相互握手[关闭]

问题描述 投票:0回答:3

我正在开发一个需要使用使用SSL相互握手的Rest API的应用程序。 Rest服务提供商共享了一个证书,即使他们不确定该证书是否正确,也将对此进行进一步研究。我浏览了有关SSL配置和通讯的网络,但是实际上我仍然有疑问。

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

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

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

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

编辑:我只想在这里添加更多细节。我正在使用的应用程序(客户端)已经在生产中,并且还使用SSL。因此,我可以通过在浏览器中点击该应用程序来获取该应用程序的公钥/证书吗?我发现我的应用程序的CA和托管其余API的应用程序是相同的。我只是在考虑是否真的需要创建密钥对并由我的CA对其进行签名或利用任何现有的密钥对?

java rest ssl client-certificates
3个回答
1
投票

因此,您有一个想要与SSL端点通信的JVM。几件事情需要就地解决:

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

在JVM Keystore中,您可以保留自己的身份:这通常是JKS,应具有“ PrivateKeyEntry”。此PrivateKeyEntry实际上是您的密钥的P12导入+签名证书

此文件作为KeyStore系统属性(并且您需要提供相应的密码...这就是另一个蠕虫病毒)

要使您信任另一方,您必须信任他们。这意味着您要么将其实际的“证书”导入到TrustStore JKS中,要么导入相应的CA证书(颁发者证书)]

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

注意:没有什么可以阻止您使用与密钥库和信任库相同的JKS文件。您只需要在同一JKS文件中导入P12和受信任的证书条目。

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

  1. 服务器将提供其身份
  2. 您的客户端将提供其身份(这是您的Java密钥库中设置的身份)
  3. 您将查找服务器提供的身份并签入TrustStore。在这里,您可以找到相同的主题条目或发行者的主题条目
  4. 服务器对您的身份相同
  5. 双方互相信任。他们现在协商了一个通用密码
  6. 使用密码加密频道

注意:以上步骤是对SSL握手的粗略解释。如果需要详细信息,可以在Wiki上查找SSL握手。

现在就您的问题:

如何生成私钥?

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

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

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

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

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

希望这会有所帮助:)


0
投票

[作为REST API的客户端来回答您的问题,您应该(使用任何喜欢的工具,例如:Keystore Explorer或提供的Java:keytool):

  1. 创建密钥对(通常为RSA 2048位),并将其存储在某种类型的存储中(这可以是PKCS12 / PFX文件,或者是为了在诸如HSM的硬件中具有较高的安全性)
  2. 创建一个包含密钥对的公共密钥和有关客户端的信息(例如DNS名称,emailAddress等)的证书签名请求(CSR),并将使用您的私钥进行签名
  3. 将CSR提交给您的REST API信任的证书颁发机构(这可以是私有内部证书颁发机构,也可以是公共证书颁发机构,只需确保它受服务器信任即可)
  4. 从证书颁发机构请求正确的证书类型(名为:“扩展/增强的密钥用法”的属性应包括:“客户端身份验证”,可以与“服务器身份验证”结合使用,但是出于安全考虑,您可能需要分开这些职责)
  5. 将证书导入您的密钥库(密钥对所在的位置),并将您的应用程序配置为使用此密钥库
  6. 以-Djavax.net.debug = all启动Java并观察应用程序与服务器的交互,服务器应提示客户端输入证书,并用(可能为空)列表指示其信任的用于签署客户端证书的证书颁发机构(空列表意味着任何客户端证书都可以)

另请参见其他用户的许多类似问题:

如果有疑问,请随时从权威来源阅读相关的RFC,以获取详细信息:

取决于协议的版本,存在一些差异(可能在初次握手期间或之后在重新协商期间请求客户端证书(TLSv1.2)或使用后握手身份验证(TLSv1.3),因为从新的协商中删除了重新协商协议(但是HTTP / 2与此不同,请参见:https://www.rfc-editor.org/rfc/rfc8740.html


-1
投票

似乎您需要一种方式使用SSL。客户端在此验证服务器,即服务器显示其公钥以对其客户端进行身份验证。在您的情况下,我想当您使用密钥库生成SSL证书时,该应用程序具有可用于向客户端进行身份验证的公用密钥,以及用于解密使用公用密钥加密的通信的专用密钥。您可以在开发中生成密钥库文件,但是当移至生产环境时,请使用CA授权的证书并将其导入到密钥库中。

© www.soinside.com 2019 - 2024. All rights reserved.