每当我们尝试连接到URL时,
如果另一个站点上的服务器运行在https协议上并且要求我们通过证书中提供的信息进行通信,则可以使用以下选项:
1)索取证书(下载证书),并在trustore中导入此证书。可以在\ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts中找到默认的trustore Java使用,然后接受重新连接到URL的连接。
2)在正常的业务情况下,我们可能会连接到组织中的内部URL,我们知道它们是正确的。在这种情况下,您相信它是正确的URL。在上述情况下,可以使用不强制存储证书以连接到特定URL的代码。
对于第二点,我们必须执行以下步骤:
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。