SOAP请求:HTTP URLConnection Factory的非法协议https

时间:2011-11-15 16:00:53

标签: java web-services soap wsdl ioexception

问题:

我正在调用SOAP Web服务,但需要在每次调用时更改URL。但是,wsdl中的终点是一个内部地址,所以我试图自己编辑端点。假设这是正确的事情(?),我得到 java.io.IOException:HTTP URLConnection Factory的非法协议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();

Stacktrace:

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)

2 个答案:

答案 0 :(得分:1)

我发现的解决方案远非理想,但似乎有效。如果您有更好的解决方案,请在此处发布。

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

为了解决这个问题,我使用的是本地版本的wsdl文件,并输入两个端点,一个http和一个https。然后,当我更改端点时,我要么更改http一个,要么更改https一个,具体取决于我是想要http还是https。

答案 1 :(得分: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();
}