Android Volley Self подписанный сертификат

Я пытаюсь получить доступ к HTTPS URL из моего приложения для Android. У меня есть самоподписанный сертификат для моего сервера (server_certificate.cer).

Я хочу знать, как добавить самоподписанный сертификат в сетевые запросы залпа, чтобы доверять моему самоподписанному сертификату. попробовал с http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/

и получение javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: доверенная привязка для пути сертификации не найдена.

1 ответ

Я успешно следовал этому руководству.

Вам необходимо создать файл хранилища ключей (например, "cert_keystore.pkcs12"), в котором будет содержаться сертификат вашего сервера, и добавить его в свое приложение.

Я обнаружил, что проще всего использовать формат PKCS12 для файла хранилища ключей. (добавлять -deststoretype PKCS12 параметр при преобразовании хранилища ключей с помощью keytool)

Мой тестовый сервер был на IP-адресе, мне пришлось отключить проверку имени хоста, чтобы он работал с моим самозаверяющим сертификатом. Этот другой урок был полезен.

Я должен был добавить HttpsURLConnection.setDefaultHostnameVerifier() с пользовательским HostnameVerifier и HttpsURLConnection.setDefaultSSLSocketFactory () в newSslSocketFactory().

(newSslSocketFactory() используется в Volley.newRequestQueue(mCtx.getApplicationContext(), new HurlStack(null, newSslSocketFactory()))

Новая функция newSslSocketFactory() теперь имеет вид:

private SSLSocketFactory newSslSocketFactory()
{
    try
    {
        KeyStore trusted = KeyStore.getInstance ("PKCS12");

        // Get the raw resource, which contains the keystore with
        // your trusted certificates (root and any intermediate certs)
        InputStream in = mCtx.getApplicationContext().getAssets ().open ("cert_keystore.pkcs12");
        try {
            // Initialize the keystore with the provided trusted certificates
            // Provide the password of the keystore
            trusted.load (in, "password".toCharArray ());
        } finally {
            in.close();
        }

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(trusted);


        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify (String hostname, SSLSession session) {

                return hostname.equals ("192.168.1.10"); //The Hostname of your server

            }
        };


        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);


        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        SSLSocketFactory sf = context.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory (sf);

        return sf;
    }
    catch (Exception e)
    {
        throw new AssertionError(e);
    }
}
Другие вопросы по тегам