Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wildfly:如何使用JAXWS-RI代替Apache CXF(仅限WebService客户端)_Java_Ssl_Soap_Jax Ws_Wildfly - Fatal编程技术网

Java Wildfly:如何使用JAXWS-RI代替Apache CXF(仅限WebService客户端)

Java Wildfly:如何使用JAXWS-RI代替Apache CXF(仅限WebService客户端),java,ssl,soap,jax-ws,wildfly,Java,Ssl,Soap,Jax Ws,Wildfly,我的环境是一个Maven项目,Wildfly(8.2.1)作为应用服务器。我需要的是使用SOAP将传入REST调用中的wihin连接到第三方服务器。我需要SSL客户端身份验证;因此,我有自己的密钥库和信任库。因此,我创建了自己的SSLContext,需要让Web服务使用这个SSLContext 所有这些看起来都是这样的: // Build SSL context with own KeyManager / TrustManager SSLContext sc = SSLContext.getIn

我的环境是一个Maven项目,Wildfly(8.2.1)作为应用服务器。我需要的是使用SOAP将传入REST调用中的wihin连接到第三方服务器。我需要SSL客户端身份验证;因此,我有自己的密钥库和信任库。因此,我创建了自己的SSLContext,需要让Web服务使用这个SSLContext

所有这些看起来都是这样的:

// Build SSL context with own KeyManager / TrustManager
SSLContext sc = SSLContext.getInstance("TLS");

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

KeyStore ks = KeyStore.getInstance("JKS");
String password = "changeit";
ks.load(getClass().getResourceAsStream("/keystore"), password.toCharArray());

kmf.init(ks, password.toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);

sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

// Now build webservice client
MyWS_Service service = new MyWS_Service(null, new QName("http://...", "MyWS"));
MyWS port = service.getMyWSSOAP();

BindingProvider bindingProvider = (BindingProvider) port;

// set to use own SSLContext
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", sc.getSocketFactory());
// set endpoint
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://hostname:443/.../...");

// perform request
respObj = port.myRequest(myRequestObj);
如果我从JUnit测试调用这段代码,一切正常。它使用来自JRE的JAXWS-RI

如果我从Wildfly调用此代码,即从传入的REST调用调用调用此代码,最终需要触发此请求,则此代码不起作用,因为它不使用自己的SSLContext。它使用默认的SSLContext,第三方SOAP服务器当然会拒绝它。我看到的是,它没有使用JAXWS-RI,而是使用ApacheCXF作为JAXWS实现。所以我猜,
bindingProvider.getRequestContext().put(“com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory”,sc.getSocketFactory())只是被忽略[],没有任何效果。(我还尝试了属性名
com.sun.xml.ws.transport.https.client.SSLSocketFactory
[没有
内部
]——也没有运气。)

我知道我可以使用
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
,甚至可以使用JVM参数
javax.net.ssl.trustStore
javax.net.ssl.keyStore
(及其相应的密码属性)。由于这会影响所有连接,因此不必讨论使用此解决方案;但是,如果我仍然使用它,让我们看看会发生什么:

  • JUnit用例:它也可以工作

  • Wildfly用例:JAXWS似乎接受SSLContext,但存在SSL异常(来自服务器的CA未知警报)。这表明在如何建立连接方面甚至存在差异。如果代码是用JUnit执行的,它为什么会工作?这证明密钥库/信任库是使用正确的证书正确设置的。不是吗

编辑: 还有一个证据表明,问题在于Wildfly使用的JAXWS实现:如果我只执行一个简单的HTTPS连接,它甚至可以与我自己在Wildfly中的密钥库/信任库一起工作:

url = new URL("https://hostname:443/.../...");
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sc.getSocketFactory());
System.out.println(Utils.inputStreamToString(con.getInputStream()));
那么,最好的做法是什么?->作为问题的标题,我想尝试让Wildfly也使用JAXWS-RI而不是Apache CXF。但直到现在我才开始工作。我试图在pom中添加以下依赖项:

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.2.10</version>
    </dependency>
怎么了?我如何让Wildfly以同样的方式工作,就好像代码是从同一个项目执行的,但“作为JUnit测试”

编辑:
如果您知道如何以不同的方式(如果它是一个干净的Java EE解决方案,即不发送自己的XML主体:-),并且不使用像Axis 1这样的太旧的framworks来达到目标(在Wildfly 8.2.1上使用SSL和客户机身份验证发送SOAP请求),那么它也是受欢迎的!我确实需要尽快找到解决办法——我已经奋斗了好几天了……

我认为这很难。对此,有些评论。顺便说一下,我认为WildFly使用的是RESTEasy,而不是CXF。好的,最后,我放弃了尝试替换使用的JAX-WS实现。我用它正确地设置了ApacheCXF


这就解决了问题:。Wildfly将使用sun实现而不是apache.cxf

我认为RESTEasy用于REST(JAXR),而不是SOAP(JAXWS);因此,我非常确定Wildfly使用ApacheCxf-proof:抛出的异常(例如,当给出无效证书时)来自oposite中的Wildfly案例中的
org.Apache.CXF…
,在JUnit中是这样的:
com.sun.xml.ws…
您写道:“有一些关于这方面的评论。”您有一些链接吗?对,对,我是指JAX-RS。。请看一看:好的,这不是我需要的。我对JAX-WS不太了解,但我认为这可能是错误的
com.sun.xml.internal.WS.transport.https.client.SSLSocketFactory
。WildFly将CXF用于JAX-WS,它指向一些内部RI类。也许这里有什么东西可以帮上忙。修复CXF设置(正如您所做的)当然是正确的解决方案;然而,对于真正对覆盖感兴趣的人来说,解决方案是欢迎使用堆栈溢出。参考是很好的,但请把相关部分纳入你的答案。到目前为止,这基本上是一个只有链接的答案。
java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider com.sun.xml.ws.spi.ProviderImpl could not be instantiated
    at java.util.ServiceLoader.fail(ServiceLoader.java:232) ~[?:1.8.0_92]