Пиннинг SSL с помощью HttpsURLConnection Android - PullRequest
0 голосов
/ 13 февраля 2019

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

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate ca;
    try (ByteArrayInputStream cert = new ByteArrayInputStream(MY_CERT_STRING.getBytes())) {
        ca = cf.generateCertificate(cert);
    }
    //build the certificate
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(keyStore);
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

Сертификат успешно создан и соответствует сертификату однорангового узла.Примечание: я также попытался установить фабрику сокетов непосредственно на объекте соединения.Это не внесло никаких изменений.

Проблема в том, что я получаю 401 (неавторизованную) ошибку с сервера.Когда я иду отлаживать объект соединения, я вижу, что getLocalCertificates() возвращает null, а getServerCertificates() возвращает список сертификатов.Таким образом, я предполагаю, что сертификат не установлен должным образом, и тогда рукопожатие терпит неудачу.

...