Как скачать двоичный файл большого размера с помощью HTTPS, когда веб-серверу требуется клиентский сертификат TLS? - PullRequest
0 голосов
/ 08 апреля 2019

Я не нашел способа реализовать SSLContext с DownloadManager.Есть ли способ добавить сертификат клиента (хранилище ключей)?

На данный момент это самозаверяющий сертификат (как клиент, так и сервер).Я могу подключиться к этому серверу с помощью okhttp (управляющего SSLContext), но с помощью DownloadManager я получаю сообщение об ошибке «SSL Handshake».

1 Ответ

0 голосов
/ 08 апреля 2019

Вот мой код,

 @Nullable
private static SSLContext initTrustManager(Context context) {
    try {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        InputStream is = context.getAssets().open("s_cert.cer");
        Certificate ca;
        try {
            ca = certificateFactory.generateCertificate(is);
            Log.i("TrustManager", "ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            is.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 sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
        return sslContext;
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
    return null;
}

А вот как я это реализую:

builder.sslSocketFactory(initTrustManager(context).getSocketFactory());

Это рабочий код, поэтому, если вы по-прежнему получаете исключения, обратите внимание на сам сертификат SSL или внесите некоторые изменения в API сервера. Надеюсь, это поможет))

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