java - 客户端需要哪些 SSL 工件用于 java 中的相互握手
问题描述
我正在开发一个需要使用使用 SSL 相互握手的 Rest API 的应用程序。Rest 服务提供商共享了一个证书,即使他们不确定是否正确,并进一步调查。我已经查看了有关 SSL 配置和通信的网络,但是,实际上我仍然有疑问。
我已经阅读客户端应该使用服务器证书(公钥)和他们自己的私钥来提出请求。如果我的理解正确,以下是我的问题
我如何为此目的制作我的私钥?我尝试使用 keytool 生成密钥库,默认情况下会创建一个我认为的私钥。这是正确的方法吗?
我应该获得服务器证书/公钥吗?
如果上述问题的答案是肯定的,那么我是否应该将该证书导入我创建的密钥库,然后使用密钥库进行通信?
编辑:我只想在这里添加更多细节。我正在使用的应用程序(客户端)已经投入生产,并且也使用 SSL。那么,我可以通过在浏览器中点击应用程序来获取我的应用程序的公钥/证书吗?我发现我的应用程序的 CA 以及托管其余 api 的应用程序是相同的。我只是在想我是否真的需要创建一个密钥对并在我的情况下由 CA 签名或利用任何现有的?
解决方案
因此,您有一个想要与 SSL 端点通信的 JVM。几件事需要到位:
- 您的 JVM 必须“信任”服务器
- 您的 JVM 必须提供服务器信任的身份(证书)
- 至少一种加密算法必须匹配
在您的 JVM 密钥库中,您可以保存您的身份:这通常是一个 JKS,并且应该有一个“PrivateKeyEntry”。这个 PrivateKeyEntry 确实是您的密钥 + 签名证书的 P12 导入
该文件作为 KeyStore 系统属性(并且您需要提供相应的密码......那是另一个蠕虫罐头)
为了让您信任另一方(或多方),您必须信任他们。这意味着您要么将他们的实际“证书”导入您的 TrustStore JKS,要么导入相应的 CA 证书(颁发者证书)
该文件应作为 JVM 系统属性中的 TrustStore 文件进入(此处类似密码故事)
注意:没有什么能阻止您使用相同的 JKS 文件作为密钥库和信任库。您只需在同一个 JKS 文件中导入您的 P12 和 Trusted 证书条目。
现在,当您启动 JVM 并且客户端进行 REST 调用时:
- 服务器将提供其身份
- 您的客户将提供其身份(这是在您的 java 密钥库中设置的)
- 您将查找 Server 提供的身份并检查您的 TrustStore。在这里,您将找到相同的主题条目或发行人的主题条目
- 服务器对你的身份做同样的事情
- 双方相互信任。他们现在协商一个共同的密码
- 使用 Cipher 加密通道
注意:以上步骤是对 SSL-handshake 的粗略解释。如果您需要获得确切的详细信息,可以在 wiki 上查找 SSL 握手。
现在关于您的问题:
如何生成私钥?
- 使用 Keytool 这将生成一个自签名密钥
- 如果您没有 CA,那么您需要提取此证书并将其发送到您的服务器(否则他们可以添加 CA 证书或您的签名证书)
我应该获得服务器证书/公钥吗?
是的。如果您关心信任服务器(通常是个好主意)
如果上述问题的答案是肯定的,那么我是否应该将该证书导入我创建的密钥库,然后使用密钥库进行通信?
通常将您的密钥库与您的信任库分开是一个很好的做法。我建议将您的 P12(密钥 + 证书)放在您的密钥库中,并将服务器的证书/公钥放在您的信任库中
希望这可以帮助 :)
推荐阅读
- javascript - 了解 Javascript(单线程)
- module - 为 PythonOperator 任务导入外部包
- flutter - 如何在小部件之间传递颜色和主题信息?
- apache-flink - 有没有办法定义递归引用自身的 Flink POJO 类型?
- unity3d - 如何修改默认的 tile map collider 2D Unity?
- java - 尝试使用 JWT "status" 执行请求时发生错误:500,
- common-lisp - 为什么我不能 (push 3 '()) 在 Common Lisp 的 REPL 中?
- android - 我在颤振医生找不到 android 许可证时遇到问题 Android SDK 命令行工具不起作用
- python - Python Reddit API PRAW:ConnectionRefusedError
- reactjs - ReactJS - 如何比较/过滤两个数组的匹配 id 并将结果用于双重搜索功能?