2011-11-15 44 views
0

问题:SOAP请求:非法协议HTTPS的HTTP的URLConnection厂

我打电话一个SOAP web服务,但需要每次调用更改URL。但是,wsdl中的终点是内部地址,所以我正在尝试自己编辑端点。假设这是正确的做法(?),我得到java.io.IOException:HTTP URLConnection工厂非法协议https,我正在努力解决。

代码:

OtherCompanyWebService ws = new OtherCompanyWebService(); 
    OtherCompanyWebServicePortType port = ws.getOtherCompanyWebServiceHttpSoap11Endpoint(); 
    ServiceRequest serviceRequest = makeMyServiceRequest(); 

    BindingProvider bindingProvider = (BindingProvider) port; 
    bindingProvider.getRequestContext().put(
        BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
        "https://blah.blah.com/blah/services/blahWebService.blahWebServiceHttpSoap11Endpoint"); 

    Staff staff = port.getStaffData(serviceRequest).getStaff().getValue(); 

堆栈跟踪:

javax.xml.ws.soap.SOAPFaultException: Could not send Message. 
     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:199) 
     at $Proxy52.getStudentData(Unknown Source) 
     at uk.co.txttools.rm.service.RmServiceImpl.runRmJob(RmServiceImpl.java:209) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
     at $Proxy12.runRmJob(Unknown Source) 
     at uk.co.txttools.rm.quartz.RmJob.execute(RmJob.java:41) 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 
Caused by: org.apache.cxf.interceptor.Fault: Could not send Message. 
     at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:48) 
     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) 
     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296) 
     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:242) 
     at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) 
     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:178) 
     ... 16 more 
Caused by: java.io.IOException: Illegal Protocol https for HTTP URLConnection Factory. 
     at org.apache.cxf.transport.http.HttpURLConnectionFactoryImpl.createConnection(HttpURLConnectionFactoryImpl.java:44) 
     at org.apache.cxf.transport.http.HTTPConduit.prepare(HTTPConduit.java:480) 
     at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46) 

回答

1

我已经找到解决的方法是很不理想,但似乎工作。如果您有更好的解决方案,请在此处发布。

问题是在wsdl文件中,端点是http。发生此错误的原因是我将端点更改为https。 (可能这是一个bug?)

为了解决这个问题,我使用了wsdl文件的本地版本,并将两个端点放在一个http和一个https中。然后,当我更改端点时,我要么更改http或https,这取决于我需要http还是https。

0

当我收到此消息时,发现我没有为我的TLS客户端(WS)设置SSL上下文。

如果代码可以是任何帮助:

/** 
* Configure mutal TLS on WS given in parameter 
* 
* @param portType webservice 
* @throws Exception 
*/ 
public static void setTLS(Object ws) throws Exception { 

    if (tlsClientParameters == null) { 
     if (StringUtils.hasLength(ConfigUtils.getInstance().getProxyHost()) && StringUtils.hasLength(ConfigUtils.getInstance().getProxyPort())) { 
      System.setProperty("https.proxyHost", ConfigUtils.getInstance().getProxyHost()); 
      System.setProperty("https.proxyPort", ConfigUtils.getInstance().getProxyPort()); 
     } 

     X509Certificate[] certificatesChain = new X509Certificate[1]; 

     KeyManager[] managers = new KeyManager[1]; 

     Pkcs12 pkcs12 = new Pkcs12(); 
     pkcs12.login(new ClassPathResource(ConfigUtils.getInstance().getCertificateFileName()).getURI().getPath(), ConfigUtils.getInstance().getCertificatePassword()); 
     certificatesChain[0] = pkcs12.getCertificate(); 
     managers[0] = new SSLKeyManagers(certificatesChain, pkcs12.getKey()); 

     Client client = ClientProxy.getClient(portType); 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 

     TrustManager[] trustManager = getServerTrustManager(); 

     sslContext.init(managers, trustManager, null); 
     HTTPConduit conduit = (HTTPConduit) client.getConduit(); 

     tlsClientParameters = new TLSClientParameters(); 
     if (trustManager != null) { 
      tlsClientParameters.setTrustManagers(trustManager); 
     } 
     tlsClientParameters.setKeyManagers(managers); 
     tlsClientParameters.setSSLSocketFactory(sslContext.getSocketFactory()); 

     tlsClientParameters.setDisableCNCheck(false); 

     conduit.setTlsClientParameters(tlsClientParameters); 

    } else { 

     Client client = ClientProxy.getClient(portType); 
     HTTPConduit conduit = (HTTPConduit) client.getConduit(); 

     conduit.setTlsClientParameters(tlsClientParameters); 
    } 
} 

/** 
* 
    * Gets the trust manager 
* 
* @return keystore 
* @throws NoSuchAlgorithmException 
* @throws KeyStoreException 
* @throws ResourceException 
* @throws IOException 
* @throws CertificateException 
*/ 
private static TrustManager[] getServerTrustManager() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, ResourceException { 

    TrustManagerFactory factory = TrustManagerFactory.getInstance("X.509"); 

    KeyStore trustStore = KeyStore.getInstance("JKS"); 

    trustStore.load(new ClassPathResource(ConfigUtils.getInstance().getServerKeyStoreFileName()).getInputStream(), ConfigUtils.getInstance().getServerKeystorePassword().toCharArray()); 

    factory.init(trustStore);  
    return factory.getTrustManagers(); 
}