java - Rest 客户端通过 https 与服务器通信

标签 java security rest ssl-certificate sslhandshakeexception

我在一台服务器中有一个 REST 客户端,它将调用另一台服务器中的端点。据我所知,如果我没有导入证书,调用将由于 SSL 握手问题而失败。我还了解应该从我的服务器导出证书,然后将其导入客户端计算机。到目前为止一切顺利。

  1. 问题是,我应该从我的服务器导出什么证书?有没有某种具有特定名称的公共(public)证书?我应该在服务器端创建自签名证书,将其导出然后在客户端导入吗?

  2. 生成证书(如果是这种情况)和导出证书所需的步骤是什么?

  3. 对于现实世界的应用程序(在本例中,一台服务器与另一台服务器通信),这个(或这些)证书应该是自签名的、公开的?

  4. 证书和 JVM( key 工具、 keystore 等)之间的关系是什么?

如您所见,我的问题更多是关于基本概念。

谢谢

最佳答案

简单地说,

  1. 您可以创建自己的自签名证书。这不会保护您的应用程序免受各种攻击,但您的通信将被加密。如果您在某个 Intranet 中运行它,我认为这是一个合理的解决方案。
  2. 见下文
  3. 参见#1
  4. 参见#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/

相关文章:

java - Spring Boot : Unable to load cache item: javax/servlet/Filter

android - Android 安全项目的想法

asp.net - 如何使用 ASP.NET 保护对 SWF 文件的访问?

web-services - 创建 RESTful 复杂查询的最佳方法是什么?

php - 带有 keyBy 的 Laravel 响应返回对象和数组

java - JAXB:在 map 上使用 @XmlIDREF

java - 如何在抽象类下进行一次性操作

java - 如何将计数器放在 TextInputLayout 中(用于全角文本字段)?

java - 如何使用公钥的 mod 和 exp 初始化 Cipher 变量

rest - 如何以逗号分隔的方式获取 Jmeter 变量的值