每当我们尝试连接到 URL 时,
如果另一个站点的服务器在 https 协议上运行,并且要求我们应该通过证书中提供的信息进行通信,那么我们有以下选项:
1)索取证书(下载证书),将此证书导入trustore。默认的 trustore java 使用可以在 \Java\jdk1.6.0_29\jre\lib\security\cacerts 中找到,然后如果我们重试连接到 URL 连接将被接受。
2) 在正常的业务案例中,我们可能会连接到组织中的内部 URL,并且我们知道它们是正确的。在这种情况下,您相信它是正确的 URL。在上述这种情况下,可以使用不会强制存储证书以连接到特定 URL 的代码。
对于第 2 点,我们必须遵循以下步骤:
1) 在下面编写为 HttpsURLConnection 设置 HostnameVerifier 的方法,该方法在所有情况下都返回 true,这意味着我们信任 trustStore。
// trusting all certificate
public void doTrustToCertificates() throws Exception {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
}
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
2) 编写下面的方法,在尝试连接到 URL 之前调用 doTrustToCertificates
// connecting to URL
public void connectToUrl(){
doTrustToCertificates();//
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
System.out.println("ResponseCode ="+conn.getResponseCode());
}
此调用将返回响应代码 = 200 表示连接成功。
有关更多详细信息和示例示例,您可以参考URL。