Java игнорирует проверку сертификата

Я пытаюсь создать несколько примеров проектов 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.солнце.чистая.протокол SSL.checkRevocation=ложь не помогло. Я также попытался добавить следующий код:

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 ответов


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

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

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


это более старый вопрос, но я наткнулся на него, и он как бы psuhed меня в правильном направлении. Я мог бы получить доступ к 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. Это ничего, что я бы сделал в производстве, но как быстрый хак для незащищенного сервера, который сделал трюк для меня.