HTTPS REST ClientResponse

时间:2010-11-09 04:00:07

标签: java rest https

我需要从客户端进行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吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

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