Доверяйте всем сертификатам okHttp

В целях тестирования я пытаюсь добавить фабрику сокетов в мой okHttp-клиент, который доверяет всем, пока установлен прокси-сервер. Это было сделано много раз, но моя реализация фабрики доверенных сокетов, кажется, что-то не хватает:

class TrustEveryoneManager implements 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 null; } } OkHttpClient client = new OkHttpClient(); final InetAddress ipAddress = InetAddress.getByName("XX.XXX.XXX.XXX"); // some IP client.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAddress, 8888))); SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManager[] trustManagers = new TrustManager[]{new TrustEveryoneManager()}; sslContext.init(null, trustManagers, null); client.setSslSocketFactory(sslContext.getSocketFactory); 

Никакие запросы не отправляются из моего приложения, и никакие исключения не регистрируются, поэтому кажется, что он не работает в пределах okHttp. При дальнейших расследованиях, кажется, что Исключение поглощено в okHttp Connection.upgradeToTls() когда рукопожатие принудительно. Исключением, которое я получаю, является: javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this. javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.

Следующий код создает SSLContext который работает как шарм при создании SSLSocketFactory, который не бросает никаких исключений:

 protected SSLContext getTrustingSslContext() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { final SSLContextBuilder trustingSSLContextBuilder = SSLContexts.custom() .loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; // Accepts any ssl cert whether valid or not. } }); return trustingSSLContextBuilder.build(); } 

Проблема в том, что я пытаюсь полностью удалить все зависимости Apache HttpClient от моего приложения. Базовый код с Apache HttpClient для создания SSLContext кажется достаточно простым, но я, очевидно, не вижу чего-то, поскольку я не могу настроить свой SSLContext для соответствия этому.

Кто-нибудь сможет создать реализацию SSLContext, которая делает то, что я хочу, без использования Apache HttpClient?

На всякий случай, когда кто-то падает сюда, единственным (единственным) решением, которое сработало для меня, является создание OkHttpClient как описано здесь .

Вот код:

 private static OkHttpClient getUnsafeOkHttpClient() { try { // Create a trust manager that does not validate certificate chains final 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[]{}; } } }; // Install the all-trusting trust manager final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]); builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); OkHttpClient okHttpClient = builder.build(); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } } 

Следующий метод устарел

 sslSocketFactory(SSLSocketFactory sslSocketFactory) 

Рассмотрите возможность обновления

 sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) 

update okhttp3.0, функция getAcceptedIssuers () должна возвращать пустой массив вместо нулевого

SSLSocketFactory не предоставляет свой X509TrustManager, который является полем, которому OkHttp необходимо создать чистую цепочку сертификатов. Этот метод вместо этого должен использовать reflection для извлечения доверительного менеджера. Приложениям рекомендуется использовать sslSocketFactory (SSLSocketFactory, X509TrustManager), что позволяет избежать такого отражения.

 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslContext.getSocketFactory(), 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[]{}; } }); 

Вы не должны смотреть на переопределение проверки сертификата в коде! Если вам нужно провести тестирование, используйте внутренний / тестовый ЦС и установите корневой сертификат CA на устройстве или эмуляторе. Вы можете использовать BurpSuite или Charles Proxy, если вы не знаете, как настроить CA.

  • Как я могу различать эти две ситуации сертификата?
  • Java SSL: как отключить проверку имени хоста
  • По умолчанию SecurityProtocol в .NET 4.5
  • ASP.NET MVC RequireHttps только в производстве
  • Как отключить предупреждение ненадежного соединения Firefox с использованием Selenium?
  • Сколько информации может видеть мой интернет-провайдер?
  • Проблемы с подключением через HTTPS / SSL через собственный клиент Java
  • Heroku SSL в корневом домене
  • Последствия безопасности отключения CURLOPT_SSL_VERIFYHOST (libcurl / openssl)
  • Могут ли клиенты telnet или netcat связываться через SSL?
  • Как создать формат BKS (BouncyCastle) Java Keystore, который содержит цепочку сертификатов клиента
  • Interesting Posts

    Является ли UnitOfWork и GenericRepository шаблоном избыточным в первом коде EF 4.1?

    Как вызвать метод Scala Object с использованием отражения?

    Как преобразовать время в часовой пояс устройства iPhone?

    Проверить, реализует ли объект интерфейс

    Как работает тип Dynamic и как его использовать?

    Файл Java Jar: используйте ошибки ресурса: URI не является иерархическим

    «Const correctness» в C #

    как добавить параметры командной строки при запуске java-кода в Eclipse?

    Как использовать значения enums в f: selectItem (s)

    Как я могу подчеркнуть тест на графический процессор?

    Toshiba A205-5804 зависает при подключении

    Как изменить изображение от декартовых координат до полярных координат в Matlab?

    Ошибка конфигурации: этот раздел конфигурации не может использоваться на этом пути

    `pg_tblspc` отсутствует после установки последней версии OS X (Yosemite или El Capitan)

    Как показать и обновить эхо на одной строке

    Давайте будем гением компьютера.