суббота, 6 июля 2013 г.

SSL Trust Manager

Хак для самоподписных сертификатов.

Код отлично работающий с Http, может совершенно отказываться работать с https,если сертификаты самоподписные.(что чаще всего и есть на тестовых площадках)Для примера, если вы используете в Java класс HttpURLConnection то он выдаст следующее исключение:

 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 

Чтобы его избежать, нам нужно отключить проверку сертификатов в https.
Это исключение нам дает класс URL через который обращается HttpURLConnection.Для тестирования достаточно перегрузить trust manager, чтобы он доверял всем сертификатам)

 

// 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 
    try { 
        URL url = new URL("https://hostname/index.html"); 
    } catch (MalformedURLException e) { 
    } 


Больше такой проблемы не появится.