Восстановить SSL X509TrustManager в Java

У меня есть следующий код, который условно (на основе boolean) отключает проверку SSL-сертификата.

Однако, если я установлю boolean в false и повторно запустить мой код, проверка SSL все еще кажется отключенной (когда она должна быть повторно включена).

Итак, какова противоположная логика этого, чтобы проверка была восстановлена?

if (bIgnoreSSL) {
  TrustManager[] trustAllCertificates = new TrustManager[] {
    new X509TrustManager()
    {
      @Override
      public X509Certificate[] getAcceptedIssuers() { return null; // Not relevant.}

      @Override
      public void checkClientTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. }

      @Override
      public void checkServerTrusted(X509Certificate[] certs, String authType){ // Do nothing. Just allow them all.}
    }
  };

   HostnameVerifier trustAllHostnames = new HostnameVerifier()
   {
        @Override
        public boolean verify(String hostname, SSLSession session) { return true; // Just allow them all. }
   };

        try
        {
            System.setProperty("jsse.enableSNIExtension", "false");
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCertificates, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(trustAllHostnames);
        }
        catch (GeneralSecurityException e)
        {
            throw new ExceptionInInitializerError(e);
        }
}
else {
  // Code to restore here (Opposite of above?)
}

1 ответ

Один из вариантов - сначала сохранить значения по умолчанию в переменной, чтобы вы могли восстановить их позже:

// save defaults (do this before setting another defaults)
HostnameVerifier defaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSocketFactory defaultFactory = HttpsURLConnection.getDefaultSSLSocketFactory();

if (bIgnoreSSL) {
...
} else {
    // restore defaults
    HttpsURLConnection.setDefaultHostnameVerifier(defaultVerifier);
    HttpsURLConnection.setDefaultSSLSocketFactory(defaultFactory);
}

Другая альтернатива (лучше IMO) - не устанавливать значение по умолчанию для всех подключений, а вместо этого устанавливать для каждого отдельного подключения:

HttpsURLConnection conn = // create connection

if (bIgnoreSSL) {
    // set custom verifier and factory only for this connection
    conn.setHostnameVerifier(trustAllHostnames);
    conn.setSSLSocketFactory(sc.getSocketFactory());
}
// no need to restore (else), as I didn't change the defaults

Это изменяет верификатор и фабрику только для указанного соединения, не затрагивая значения по умолчанию (поэтому нет необходимости восстанавливать).

Другие вопросы по тегам