Получил SSLPeerUnverifiedException Имя хоста 196.1X.3X.X2 не подтверждена ошибка в Android 9 с самоподписанным сертификатом, но работает во всех других версиях - PullRequest
0 голосов
/ 04 января 2019

Когда установлено соединение Https с REST API с помощью самостоятельного сертификата, в Android 9 возникает ошибка, что javax.net.ssl.SSLPeerUnverifiedException: имя хоста 196.1X.3X.X2 не подтверждено. Но это работает в версии Android до Android (пирог). Я поставил имя хоста правильно. Что делать ? Заранее спасибо.

Мой код указан ниже.

public static String getResponse(String url) { 
    URL updateURL  ; 
   HttpsURLConnection  connection = null; 
    try { 
        HostnameVerifier hostnameVerifier = ( hostname, session ) ->{
            HostnameVerifier hv =
                    HttpsURLConnection.getDefaultHostnameVerifier();
            return hv.verify(Common.getHostnameSubject()+"", session )  ;
        };
        updateURL = new URL(url);
        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        InputStream caInput =  AppApplication.getAppContext().
                getAssets().open(Common.getCertificateAssetName());  
        Certificate ca; 
        ca = cf.generateCertificate(caInput);  
        caInput.close(); 
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca); 
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore); 
        SSLContext context = SSLContext.getInstance("TLSv1.2"); 
        context.init(null, tmf.getTrustManagers(), null); 
        connection = (HttpsURLConnection) updateURL.openConnection(); 
        if( Common.isHostnameverficationManual() ) {
            connection.setHostnameVerifier(hostnameVerifier);
        }
        connection.setConnectTimeout(60000);
        connection.setSSLSocketFactory(context.getSocketFactory());
        int status = connection.getResponseCode();  
        InputStream is = new BufferedInputStream( connection.getInputStream() ); 
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder("");
        String line;
        String nl = System.getProperty("line.separator"); 
        while ((line = in.readLine()) != null) {
            sb.append(line).append(nl);
        } 
            result = sb.toString();
    } catch ( IOException | NoSuchAlgorithmException | KeyManagementException | CertificateException | KeyStoreException e ) { 
        if (connection != null) {
            connection.disconnect(); 
        }
    } 
    return result; 
} 

1 Ответ

0 голосов
/ 04 января 2019

Пожалуйста, попробуйте этот код.

HttpsURLConnection.setDefaultHostnameVerifier((hostname, sslSession) -> {
    if(hostname.equals("196.1X.3X.X2")) return true;
    return false;
});

Вы должны подтвердить, что lambda работает в вашей среде Android Studio.

...