Запрос SOAP: недопустимый протокол https для HTTP URLConnection Factory

Проблема:

Я вызываю веб-службу SOAP, но мне нужно менять URL-адрес при каждом вызове. Однако конечная точка в wsdl была внутренним адресом, поэтому я пытаюсь изменить конечную точку самостоятельно. Предполагая, что это правильно (?), Я получаю сообщение java.io.IOException: Illegal Protocol https for HTTP URLConnection Factory, которое я изо всех сил пытаюсь решить.

Код:

    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)

person Andy A    schedule 15.11.2011    source источник


Ответы (2)


Решение, которое я нашел, далеко от идеального, но, похоже, работает. Если у вас есть лучшее решение, опубликуйте его здесь.

Проблема заключалась в том, что в файле wsdl конечная точка была http. Ошибка возникает из-за того, что я меняю конечную точку на https. (Может это баг?)

Чтобы обойти это, я использую локальную версию файла wsdl и добавляю две конечные точки, одну http и одну https. Затем, когда я меняю конечную точку, я либо меняю http, либо https, в зависимости от того, хочу ли я http или https.

person Andy A    schedule 17.11.2011

Когда я получил это сообщение, я обнаружил, что не установил контекст SSL для своего клиента TLS (WS).

Если код может чем-то помочь:

/**
 * 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();
}
person Julien BRENELIERE    schedule 27.08.2013