我需要从客户端进行 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");
}
Run Code Online (Sandbox Code Playgroud)
并按如下方式进行 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());
}
Run Code Online (Sandbox Code Playgroud)
从 SSL/HTTPS/certs 等角度来看,这是否足够(调试除外)?我还有什么需要做的吗,比如加载密钥库或初始化 SSLContext?
该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到您自己的信任库中。)