Добавление пользовательского сертификата в клиент OkHttp - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать приложение для Android, где я могу получить и проанализировать HTML (с сайта, у которого нет API).Я использую OkHttp.Сайт имеет недоверенный (но действительный) сертификат.Я получаю:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Я уже установил официальный путь (https://developer.android.com/training/articles/security-ssl#java), и теперь мне нужно связать его с OkHttpClient.

Я пытался

    OkHttpClient client = new OkHttpClient;

    OkHttpClient.Builder builder = client.newBuilder();
    builder.sslSocketFactory(sslcontext.getSocketFactory()).build();

Но это не работает, а также не рекомендуется. Спасибо

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

См. Этот документированный пример для добавления известного доверенного сертификата

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java

  public CustomTrust() {
    X509TrustManager trustManager;
    SSLSocketFactory sslSocketFactory;
    try {
      trustManager = trustManagerForCertificates(trustedCertificatesInputStream());
      SSLContext sslContext = SSLContext.getInstance("TLS");
      sslContext.init(null, new TrustManager[] { trustManager }, null);
      sslSocketFactory = sslContext.getSocketFactory();
    } catch (GeneralSecurityException e) {
      throw new RuntimeException(e);
    }

    client = new OkHttpClient.Builder()
        .sslSocketFactory(sslSocketFactory, trustManager)
        .build();
  }
0 голосов
/ 14 ноября 2018

Вам необходимо использовать sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager), который не считается устаревшим.

Используйте эту переменную (которая создает диспетчер доверия, который не проверяет цепочки сертификатов):

TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
        }
    }
};

и перейдите кsslSocketFactory() следующим образом:

builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);

также примените это для проверки каждого хоста:

builder.hostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
});
...