【问题标题】:HTTPS REST ClientResponseHTTPS REST 客户端响应
【发布时间】:2025-03-31 01:40:01
【问题描述】:

我需要从客户端进行 HTTPS 调用。我不需要向服务器发送证书,只需要验证来自服务器的证书。

我研究了这个话题,这是我的理解。你能确认一下吗?我还没有测试服务,可以用来验证我的代码……但仍需要按时完成……任何建议/输入都会有所帮助。

我将此添加到我的班级:

private static String appKeyFile = "/project/src/security/cert_file.jck";  
private static String key = "password";  
static {  
    System.setProperty("javax.net.ssl.keyStore", appKeyFile);  
    System.setProperty("javax.net.ssl.keyStorePassword",key);  
    System.setProperty("javax.net.ssl.keyStoreType","JCEKS");  
}  

并按如下方式进行 HTTPS 调用:

config = new DefaultClientConfig();  
client = Client.create(config);  
service = client.resource(UriBuilder.fromUri("https://localhost:8081/TestService").build());  
clientResponse = service.path("rs").path("test").path("getCustomerDetail")  
        .accept(MediaType.APPLICATION_XML)  
        .post(ClientResponse.class, customerRequestType);  

if (clientResponse.getStatus() == Response.Status.OK.getStatusCode()) {   
    custResponseType = clientResponse.getEntity(CustResponseType.class);  
    System.out.println("First Name" + 
    custResponseType.getFirstName());  
}

从 SSL/HTTPS/certs 等角度来看,这是否足够(调试除外)?还有什么我需要做的吗,比如加载密钥库或初始化 SSLContext?

【问题讨论】:

  • 您使用的是哪个面向 REST 的库?

标签: java rest https


【解决方案1】:

javax.net.ssl.keyStore* 属性(密钥库)用于使用它的一方的密钥和证书。也就是说,在服务器上,它应该包含服务器证书及其私钥;在客户端上,它应该包含客户端证书及其私钥。

相比之下,信任库(javax.net.ssl.trustStore* 属性)包含用于验证远程方证书的可信证书。在客户端,它用于确定您是否信任服务器证书(通常,通过链接到客户端信任的 CA 证书);在服务器上,它用于验证客户端证书。

信任库和密钥库都是密钥库文件/对象(术语并没有真正的帮助)。

如果您在客户端设置javax.net.ssl.keyStore*,客户端将使用它来提供其证书(只能由服务器请求,而且您似乎并没有使用它)。它仍将使用默认信任库(随 JRE 提供/配置),并且不太可能包含 cert_file.jck 中的特定证书(这可能是您为服务器生成的自签名证书)。而是将javax.net.ssl.trustStore* 属性设置为指向该文件。

(如果您也希望默认 CA 证书可用,我建议将默认信任库中的证书复制到您自己的信任库中,通常是从 $JAVA_HOME/lib/security/jssecacerts$JAVA_HOME/lib/security/cacerts 复制。)

【讨论】:

  • 感谢您的回复!最后我正确理解了信任库和密钥库之间的区别。现在对解决方案更有信心...
【解决方案2】:

如果您使用自签名证书,您可能会遇到与 SSL 证书验证相关的问题。 This link 讨论这个。

【讨论】:

  • 是的,我浏览了那个链接,并记下了导入证书..您预见到的任何其他问题?