Кожного разу, коли ми намагаємося підключитися до URL-адреси,
якщо сервер на іншому сайті працює за протоколом https і вимагає спілкуватися через інформацію, надану в сертифікаті, то у нас є наступний варіант:
1) запитати сертифікат (завантажити сертифікат), імпортувати цей сертифікат у trustore. Використання Java Trustore за замовчуванням можна знайти в \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, тоді, якщо ми спробуємо підключитися до URL-з'єднання, буде прийнято.
2) У звичайних бізнес-випадках ми можемо підключатися до внутрішніх URL-адрес в організаціях, і ми знаємо, що вони правильні. У таких випадках ви довіряєте, що це правильна URL-адреса. У таких випадках вище може використовуватися код, який не вимагає зберігати сертифікат для підключення до певної URL-адреси.
для точки № 2 ми повинні виконати наступні кроки:
1) напишіть нижче метод, який встановлює HostnameVerifier для HttpsURLConnection, який повертає істину для всіх випадків, тобто ми довіряємо 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) напишіть нижче метод, який викликає doTrustToCertificate перед тим, як спробувати підключитися до 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());
}
Цей виклик поверне код відповіді = 200 означає, що з'єднання успішне.
Більш детально та приклад прикладу можна посилатись на URL .