Java JAX WS客户端和SSL握手异常
我使用一个wsdl文件创建了一个JAX-WS客户机。所有这些都可以在本地主机上正常工作,但不能在服务器上正常工作。 我得到的原因是:javax.net.ssl.SSLHandshakeException ... 原因:sun.security.validator.validator异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator.PKIXValidator上找到请求目标的有效证书路径 我知道,我的JAX-WS客户机不信任证书。因此,我在这里找到了一个快速而肮脏的解决方案:并尝试实现它: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
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运行?仔细地追踪,你的下一个问题应该是什么就会变得非常明显:-)