java - игнорировать просроченный ssl-сертификат - PullRequest
6 голосов
/ 01 января 2012
URL myUrl = new URL("https://www.....");

Срок действия сертификата SSL на сайте истек.Как этого избежать и заставить работать URL ()?

Ответы [ 3 ]

20 голосов
/ 01 января 2012

Вы должны создать TrustManager, который обернет менеджер доверия по умолчанию, перехватит CertificiateExpiredException и проигнорирует его.

Примечание: как описано в , этоответ , является ли это безопасным или нет, зависит от реализации.В частности, он основан на проверке даты, выполняемой в последний раз, после того, как все остальное было проверено должным образом.

Что-то в этом духе должно работать:

TrustManagerFactory tmf = TrustManagerFactory.getInstance(
    TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
tmf.init((KeyStore)null); 

TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];

TrustManager[] wrappedTrustManagers = new TrustManager[]{
   new X509TrustManager() {
       public java.security.cert.X509Certificate[] getAcceptedIssuers() {
          return origTrustmanager.getAcceptedIssuers();
       }

       public void checkClientTrusted(X509Certificate[] certs, String authType) {
           origTrustmanager.checkClientTrusted(certs, authType);
       }

       public void checkServerTrusted(X509Certificate[] certs, String authType) {
           try {
               origTrustmanager.checkServerTrusted(certs, authType);
           } catch (CertificateExpiredException e) {}
       }
   }
};

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, wrappedTrustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Менеджеры доверия выдаютCertificateException s (подробности см. В подклассах), когда что-то не так с сертификатом.Будьте конкретны в том, что вы хотите поймать / игнорировать.Все, что вы действительно хотите проверить, должно быть проверено перед тем, как то, что вы ловите, может быть выброшено, или вам придется проверять это также вручную.Все, что более непринужденно, чем это (в частности, ничего не делать и, следовательно, не генерировать исключений), будет полностью игнорировать проверку и подтверждение сертификата, что примерно равнозначно использованию анонимных наборов шифров или игнорированию аутентификации.Это отрицательно сказалось бы на целях безопасности использования SSL / TLS (в отличие от того, чтобы быть более гибким в отношении срока действия).

2 голосов
/ 01 января 2012

Вам необходимо создать собственный валидатор X509, который будет игнорировать просроченные сертификаты.Фактически, проверка не будет выполняться.

Код, взятый отсюда: http://exampledepot.com/egs/javax.net.ssl/TrustAll.html

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}

// Now you can access an https URL without having the certificate in the truststore
// It should work with expired certificate as well
try {
    URL myUrl = new URL("https://www.....");
} catch (MalformedURLException e) {
}
1 голос
/ 22 июля 2016

Я написал собственный TrustManager для решения этой проблемы, его можно увидеть по адресу https://gist.github.com/divergentdave/9a68d820e3610513bd4fcdc4ae5f91a1. Этот TrustManager оборачивает нарушающий сертификат X509 в другой класс, чтобы отключить проверку срока действия, оставив все остальные проверки на месте. (то есть сопоставляет имя хоста, цепочки с доверенным ЦС, действительная подпись и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...