Java JAX WS客户端和SSL握手异常

Java JAX WS客户端和SSL握手异常,java,web-services,ssl,jax-ws,Java,Web Services,Ssl,Jax Ws,我使用一个wsdl文件创建了一个JAX-WS客户机。所有这些都可以在本地主机上正常工作,但不能在服务器上正常工作。 我得到的原因是:javax.net.ssl.SSLHandshakeException ... 原因:sun.security.validator.validator异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator.PKIXValida

我使用一个wsdl文件创建了一个JAX-WS客户机。所有这些都可以在本地主机上正常工作,但不能在服务器上正常工作。 我得到的原因是:javax.net.ssl.SSLHandshakeException ... 原因:sun.security.validator.validator异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator.PKIXValidator上找到请求目标的有效证书路径

我知道,我的JAX-WS客户机不信任证书。因此,我在这里找到了一个快速而肮脏的解决方案:并尝试实现它:

ApiVersion1Service apiVersion1Service = new ApiVersion1Service(wsdlURL, SERVICE_NAME);
    APIport = apiVersion1Service.getApiVersion1Port();

    // SOAP Header
    BindingProvider bindingProvider = (BindingProvider) APIport;
    Binding binding = bindingProvider.getBinding();
    Map<String, Object> requestContext = bindingProvider.getRequestContext();

    requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL + accountID);
    List<Handler> handlers = binding.getHandlerChain();
    handlers.add(new SOAPAuthenticationHandler(username, password));
    binding.setHandlerChain(handlers);

    // SSL
    SSLContext context = SSLContext.getInstance("SSL");
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }
        public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }
    } };
    context.init(null, trustAllCerts, new SecureRandom());
    SSLSocketFactory sslSocketFactory = context.getSocketFactory(); 
    bindingProvider.getRequestContext().put(/*JAXWSProperties.SSL_SOCKET_FACTORY*/ "com.sun.xml.ws.transport.https.client.SSLSocketFactory" , sslSocketFactory);
ApiVersion1Service ApiVersion1Service=新的ApiVersion1Service(wsdlURL,服务名称);
APIport=apiVersion1Service.getApiVersion1Port();
//SOAP头
BindingProvider BindingProvider=(BindingProvider)APIport;
Binding Binding=bindingProvider.getBinding();
Map requestContext=bindingProvider.getRequestContext();
put(BindingProvider.ENDPOINT\u ADDRESS\u属性,WS\u URL+accountID);
列表处理程序=binding.getHandlerChain();
添加(新的SOAPAuthenticationHandler(用户名、密码));
binding.setHandlerChain(处理器);
//SSL
SSLContext context=SSLContext.getInstance(“SSL”);
TrustManager[]trustAllCerts=new TrustManager[]{new X509TrustManager(){
公共X509证书[]getAcceptedIssuers(){
返回null;
}
public void checkServerTrusted(X509Certificate[]certs,String authType)引发CertificateException{
返回;
}
public void checkClientTrusted(X509Certificate[]certs,String authType)引发CertificateException{
返回;
}
} };
init(null,trustAllCerts,new SecureRandom());
SSLSocketFactory SSLSocketFactory=context.getSocketFactory();
bindingProvider.getRequestContext().put(/*JAXWSProperties.SSL_SOCKET_FACTORY*/“com.sun.xml.ws.transport.https.client.SSLSocketFactory”,SSLSocketFactory);
。。。。但我还是得到了SSLHandshakeException。你知道吗? 谢谢你的帮助

public class VerifyEverythingHostnameVerifier
        implements HostnameVerifier {

    @Override
    public boolean verify(String string, SSLSession sslSession) {
        return true;
    }
}
使用:

 HttpsURLConnection.setDefaultHostnameVerifier(new VerifyEverythingHostnameVerifier());

不确定这是否有效,但在context.init之后添加一行:SSLContext.setDefault(context);您是否尝试过使用-Djavax.net.debug=all运行?仔细地追踪,你的下一个问题应该是什么就会变得非常明显:-)