Ilekroć próbujemy połączyć się z adresem URL,
jeśli serwer w innej witrynie działa na protokole https i nakazuje nam komunikację za pośrednictwem informacji podanych w certyfikacie, mamy następującą opcję:
1) poproś o certyfikat (pobierz certyfikat), zaimportuj ten certyfikat do trustore. Domyślne zastosowania trustore java można znaleźć w \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, a jeśli spróbujemy ponownie połączyć się z adresem URL, połączenie zostanie zaakceptowane.
2) W normalnych przypadkach biznesowych możemy łączyć się z wewnętrznymi adresami URL w organizacjach i wiemy, że są one poprawne. W takich przypadkach ufasz, że jest to poprawny adres URL. W takich przypadkach można użyć kodu, który nie upoważnia do przechowywania certyfikatu w celu połączenia się z określonym adresem URL.
dla punktu nr 2 musimy wykonać poniższe kroki:
1) napisz poniżej metodę, która ustawia HostnameVerifier dla HttpsURLConnection, który zwraca wartość true dla wszystkich przypadków, co oznacza, że ufamy 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) napisz poniżej metodę, która wywołuje doTrustToCertificates przed próbą połączenia się z adresem URL
// 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());
}
To wywołanie zwróci kod odpowiedzi = 200 oznacza, że połączenie się powiodło.
Więcej szczegółów i przykładowy przykład można znaleźć pod adresem URL .