Java игнорирует проверку сертификата - PullRequest
6 голосов
/ 13 июля 2011

Я пытаюсь создать несколько примеров проектов Java, которые подключаются к самозаверяющему HTTPS-серверу. Я не могу заставить Java перестать пытаться проверить сертификат. Я не хочу доверять этому сертификату, я просто хочу полностью игнорировать проверку сертификата; этот сервер находится в моей сети, и я хочу иметь возможность запускать некоторые тестовые приложения, не беспокоясь о том, действителен ли сертификат.

java -Dcom.sun.net.ssl.checkRevocation=false HelloWorld
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:  sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

-Dcom.sun.net.ssl.checkRevocation = false не помогло. Я также попытался добавить следующий код:

public static void DisableCertificateValidation() {
  TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
      public X509Certificate[] getAcceptedIssuers() { return null; }
      public void checkClientTrusted(X509Certificate[] certs, String authType) { }
      public void checkServerTrusted(X509Certificate[] certs, String authType) { }
    }
  };
  try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  } catch (Exception e) {
  }
}

Но все еще есть та же проблема. Что здесь происходит?

Ответы [ 2 ]

10 голосов
/ 13 июля 2011

org.apache.axis2.AxisFault означает, что вы используете Axis 2, а Axis 2 не использует HttpsURLConnection для создания своих HTTP (S) -соединений, но Apache HttpClient (3.x, насколько я знаю), поэтому HttpsURLConnection.setDefaultSSLSocketFactory(...) не будет иметь никакого эффекта.

Вы можете взглянуть на этот ответ о настройке SSLContext для оси 2, более конкретно, этого документа: http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

(В качестве альтернативы вы можете избежать установки значения по умолчанию SSLContext с помощью SSLContext.setDefault(...), представленного в Java 6. Отключение проверки сертификата для контекста SSL по умолчанию, очевидно, не является хорошей идеей в реальном приложении.)

4 голосов
/ 07 марта 2013

Это старый вопрос, но я наткнулся на него, и это как бы подтолкнуло меня в правильном направлении. Я мог получить доступ к URL-адресу https в axis2 без действительного сертификата клиента, установив параметры:

import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.Protocol;

EasySSLProtocolSocketFactory easySSLProtocolSocketFactory;
try {
     easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory();
     Protocol.unregisterProtocol("https");
     Protocol.registerProtocol("https", new Protocol("https",
                  (ProtocolSocketFactory) easySSLProtocolSocketFactory, 443));
}
catch (GeneralSecurityException e) {
      e.printStackTrace();
}

Обязательно сделайте это перед вызовом сервисного клиента axis2. Это не то, что я бы делал на производстве, но как быстрый взлом для незащищенного сервера, который помог мне.

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