java jws игнорирует доверенный сертификат - PullRequest
0 голосов
/ 03 октября 2018

У меня возникла проблема с использованием «стандартного кода», который я нашел на многих форумах, что позволяет мне пропустить проверку доверенных сертификатов в Java.

Мой код реализует реализацию клиента wsdl старого стиля.Я использую jdk 1.8.

public class myClass exteds Service{

public SessionProxy(String baseurl, SSLSocketFactory sslFactory, boolean compression) {
    // Get the port
    port = super.getPort(new QName("http://host.com/d3s/jel/dk/service/something/v2u1.wsdl", "Port"), Port.class);

    // Set the endpoint address
    Map<String, Object> context = ((BindingProvider) port).getRequestContext();
    if (baseurl != null) {
        context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, baseurl);
    }   

    SSLTool.disableCertificateValidation();

    if (sslFactory != null) {
        context.put(JAXWSProperties.SSL_SOCKET_FACTORY, sslFactory);
    }

}

public String recordSessions(CasinoGameSessions sessions) throws 
    SystemFaultException, UserFaultException {
    String result= "";
    result += port.recordSessions(sessions) + "\n";
    disposeSSLSocketFactory();
    return result;
}

Это класс SSLTool, который я нашел (многие другие примеры кода действительно похожи на этот)

import javax.net.ssl.*;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

public class SSLTool {

public static void disableCertificateValidation() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
    }
    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}};

// Ignore differences between given hostname and certificate hostname
HostnameVerifier hv = new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) { return true; }
};

// Install the all-trusting trust manager
try {
  SSLContext sc = SSLContext.getInstance("SSL");
  sc.init(null, trustAllCerts, new SecureRandom());
  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  HttpsURLConnection.setDefaultHostnameVerifier(hv);
} catch (Exception e) {}

}}

Когда я запускаю свой код, несмотря на то, что я вызываю SSLTool.disableCertificationValidation (), я получаю исключение:

aused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.8.0_162]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[?:1.8.0_162]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2038) ~[?:1.8.0_162]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1135) ~[?:1.8.0_162]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) ~[?:1.8.0_162]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) ~[?:1.8.0_162]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397) ~[?:1.8.0_162]
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) ~[?:1.8.0_162]
at sun.net.www.protocol.https.AbstractDelegateHttpsUR

Это должно означать, что мой клиент по-прежнему пытается проверить сертификат сервера и выполнить с ним рукопожатие.

Что не так в моем коде?Спасибо.

...