我在一台服务器中有一个 REST 客户端,它将调用另一台服务器中的端点。据我所知,如果我没有导入证书,调用将由于 SSL 握手问题而失败。我还了解应该从我的服务器导出证书,然后将其导入客户端计算机。到目前为止一切顺利。
问题是,我应该从我的服务器导出什么证书?有没有某种具有特定名称的公共(public)证书?我应该在服务器端创建自签名证书,将其导出然后在客户端导入吗?
生成证书(如果是这种情况)和导出证书所需的步骤是什么?
对于现实世界的应用程序(在本例中,一台服务器与另一台服务器通信),这个(或这些)证书应该是自签名的、公开的?
- 证书和 JVM( key 工具、 keystore 等)之间的关系是什么?
如您所见,我的问题更多是关于基本概念。
谢谢
最佳答案
简单地说,
- 您可以创建自己的自签名证书。这不会保护您的应用程序免受各种攻击,但您的通信将被加密。如果您在某个 Intranet 中运行它,我认为这是一个合理的解决方案。
- 见下文
- 参见#1
- 参见#2
要在服务器中生成证书,您可以执行类似的操作
/opt/jdk1.7.0_40/bin/keytool -genkey -alias tomcat -keypass mypassword -keystore keystore.key -storepass mypassword -keyalg RSA
然后您可能需要添加一些步骤来配置您的网络服务器。您还没有指定任何内容,但如果您使用的是 tomcat,则需要在 server.xml 中添加类似的内容
<Connector
port="8443"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="/path.to.your.keystore/keystore.key"
keystorePass="mypassword" />
要在客户端导入证书,您可以使用firefox打开登录页面,右键单击该页面并打开“查看页面信息”,然后转到“安全”选项卡,然后单击“查看证书”,单击“详细信息”,然后单击“导出”。
默认是x.509 PEM,这是可以的。假设您已将文件保存为“TomcatUser.pem.x509”,您必须以java可以理解的格式将证书存储在 keystore 中,就像这样
/opt/jdk1.7.0_40/bin/keytool -import -file TomcatUser.pem.x509 -keystore ~yourUser/MyLocalKeypass -storepass xyz
最后,您的客户将需要这样的东西
System.setProperty("javax.net.ssl.trustStore","~yourUser/MyLocalKeypass");
System.setProperty("javax.net.ssl.trustStorePassword","xyz");
关于java - Rest 客户端通过 https 与服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21453439/