我正在开发一个需要使用使用SSL相互握手的Rest API的应用程序。 Rest服务提供商共享了一个证书,即使他们不确定该证书是否正确,也将对此进行进一步研究。我浏览了有关SSL配置和通讯的网络,但是实际上我仍然有疑问。
我已阅读客户端,应该使用服务器证书(公共密钥)和自己的私有密钥来进行请求。如果我的理解正确,以下是我的问题
我如何为此目的创建我的私钥?我尝试使用keytool生成密钥库,默认情况下会创建我认为的私钥。这是正确的方法吗?
我应该获得服务器证书/公钥吗?
如果上述问题的答案是肯定的,那么我应该将该证书导入到我创建的密钥库中,然后使用密钥库进行通信吗?
编辑:我只想在这里添加更多细节。我正在使用的应用程序(客户端)已经在生产中,并且还使用SSL。因此,我可以通过在浏览器中点击该应用程序来获取该应用程序的公钥/证书吗?我发现我的应用程序的CA和托管其余API的应用程序是相同的。我只是在考虑是否真的需要创建密钥对并由我的CA对其进行签名或利用任何现有的密钥对?
因此,您有一个想要与SSL端点通信的JVM。几件事情需要就地解决:
在JVM Keystore中,您可以保留自己的身份:这通常是JKS,应具有“ PrivateKeyEntry”。此PrivateKeyEntry实际上是您的密钥的P12导入+签名证书
此文件作为KeyStore系统属性(并且您需要提供相应的密码...这就是另一个蠕虫病毒)
要使您信任另一方,您必须信任他们。这意味着您要么将其实际的“证书”导入到TrustStore JKS中,要么导入相应的CA证书(颁发者证书)]
此文件应作为JVM的系统属性中的TrustStore文件进入(此处类似密码故事)
注意:没有什么可以阻止您使用与密钥库和信任库相同的JKS文件。您只需要在同一JKS文件中导入P12和受信任的证书条目。
现在,当您启动JVM且客户端进行REST调用时:
注意:以上步骤是对SSL握手的粗略解释。如果需要详细信息,可以在Wiki上查找SSL握手。
现在就您的问题:
如何生成私钥?
我应该获得服务器证书/公钥吗?
是。如果您关心信任服务器(通常是个好主意)
如果上述问题的答案是肯定的,那么我应该将该证书导入到我创建的密钥库中,然后使用密钥库进行通信吗?
通常,将密钥库与trustStore分开是一种很好的做法。我建议将P12(密钥+证书)放在密钥库中,并将服务器的证书/公钥放在信任库中
希望这会有所帮助:)
[作为REST API的客户端来回答您的问题,您应该(使用任何喜欢的工具,例如:Keystore Explorer或提供的Java:keytool):
另请参见其他用户的许多类似问题:
如果有疑问,请随时从权威来源阅读相关的RFC,以获取详细信息:
取决于协议的版本,存在一些差异(可能在初次握手期间或之后在重新协商期间请求客户端证书(TLSv1.2)或使用后握手身份验证(TLSv1.3),因为从新的协商中删除了重新协商协议(但是HTTP / 2与此不同,请参见:https://www.rfc-editor.org/rfc/rfc8740.html)
似乎您需要一种方式使用SSL。客户端在此验证服务器,即服务器显示其公钥以对其客户端进行身份验证。在您的情况下,我想当您使用密钥库生成SSL证书时,该应用程序具有可用于向客户端进行身份验证的公用密钥,以及用于解密使用公用密钥加密的通信的专用密钥。您可以在开发中生成密钥库文件,但是当移至生产环境时,请使用CA授权的证书并将其导入到密钥库中。