Статьи

Как настроить TrustManager пользовательского SSLSocketFactory для каждого URL-соединения

Из javadoc видно, что javax.net.ssl.HttpsURLConnection предоставил статический метод для переопределения с помощью метода setDefaultSSLSocketFory (). Это позволяет вам предоставлять пользовательский javax.net.ssl.TrustManager, который может проверять рукопожатие, проверку сертификатов вашего собственного CA и т. Д. Но это заменит значение по умолчанию для всех URL-адресов «https» для вашей JVM!

Итак, как мы можем переопределить только один URL-адрес https? Глядя на javax.net.ssl.HttpsURLConnection снова, мы видим метод экземпляра для setSSLSocketFactory (), но мы не можем создать экземпляр объекта HttpsURLConnection напрямую! Мне потребовалось некоторое время, чтобы понять, что java.net.URL на самом деле является фабричным классом для его реализации! Подобный экземпляр можно получить с помощью нового URL («https: // localhost») .openConnection ().

В завершение этой статьи я приведу простой рабочий пример, демонстрирующий это.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package zemian;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
 
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
 
public class WGetText {
    public static void main(String[] args) throws Exception {
        String urlString = System.getProperty("url", "https://google.com");
        URL url = new URL(urlString);
        URLConnection urlConnection = url.openConnection();
        HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection;
        SSLSocketFactory sslSocketFactory = createSslSocketFactory();
        httpsUrlConnection.setSSLSocketFactory(sslSocketFactory);
        try (InputStream inputStream = httpsUrlConnection.getInputStream()) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
 
    private static SSLSocketFactory createSslSocketFactory() throws Exception {
        TrustManager[] byPassTrustManagers = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
 
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }
 
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }
        } };
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, byPassTrustManagers, new SecureRandom());
        return sslContext.getSocketFactory();
    }
}