我正在编写一个简单的Java程序来调用RESTFUL Web服务,并为我提供了一个用于SSL身份验证的.cer
文件。
我不确定如何在Java中使用.cer
文件进行SSL握手,因此,当我尝试调用Web服务时,我会得到SSL Handshake error
。
您能在这里引导我吗?预先感谢。
我已经为SSL身份验证提供了.cer文件。
这还不够。
您应该有一个私钥,您应该自己创建它,而不是给予它,并且您应该从中生成自签名的证书,否则将证书签名请求(CSR)(CSR)并签署了CSR由证书机构(CA)。
要使用它在Java中对自己进行身份验证,私钥和证书都需要在相同的别名下放在密钥库中,并且您需要通过系统属性javax.net.ssl.keyStore
和javax.net.ssl.keyStorePassword
提供密钥库及其密码,否则通过更复杂的代码方法,您将在JSSE参考指南中找到记录的代码方法。
您可以禁用握手。这是测试代码:
private static void sslTest(String serviceUrl, String username, String password) throws Exception {
System.setProperty("jsse.enableSNIExtension", "false");
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
return true;
}
})
.useTLS()
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).setSSLSocketFactory(sslsf).build();
String content = "";
try {
HttpResponse response = client.execute(new HttpGet(serviceUrl));
if (Integer.toString(response.getStatusLine().getStatusCode()).equalsIgnoreCase("200")) {
HttpEntity entity = response.getEntity();
content = EntityUtils.toString(entity);
System.out.println(content);
}
} catch (Exception e) {
logger.error("Exception : {}", e.getMessage());
}
}