当前位置: 首页 > 知识库问答 >
问题:

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

司马羽
2023-03-14

我的环境是一个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);

如果我从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。网ssl。信任库javax。网ssl。密钥库(及其相应的密码属性)。由于这会影响所有连接,因此使用此解决方案是不可讨论的;然而,让我们看看,如果我使用它,会发生什么:

>

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()));

那么,最好的做法是什么-

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.2.10</version>
    </dependency>

但这给了我以下例外:

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]

怎么了?我怎么能让Wildfly以同样的方式工作,就好像代码是在同一个项目中执行的,但是“作为一个JUnit测试”?

编辑:如果您有一个如何以不同的方式(前提是它是一个干净的Java EE解决方案,即不发送自己的XML正文:-)达到目标(使用Wildfly 8.2.1上带有客户端身份验证的SSL发送SOAP请求)的技巧,并且不使用Axis 1这样的太旧framworks,也很受欢迎!我确实需要一个解决方案-我已经战斗了好几天了。。。


共有3个答案

班经亘
2023-03-14

我认为这很难。关于这一点,有一些评论。顺便说一下,我认为WildFly使用的是RESTEasy,而不是CXF

云正信
2023-03-14

这就解决了问题:https://stackoverflow.com/a/46894256/8190026.Wildfly将使用sun实现而不是apache。cxf

顾俊茂
2023-03-14

好的,最后,我放弃了尝试替换使用的JAX-WS实现。我用它来正确设置Apache CXF。

https://stackoverflow.com/a/37268853/4106030

 类似资料:
  • 问题内容: 我的环境是作为应用程序服务器的Maven项目和Wildfly(8.2.1)。我需要使用SOAP将传入的REST调用与第三方服务器连接。我需要SSL客户端身份验证;因此,我有自己的KeyStore和TrustStore。因此,我创建了自己的SSLContext,需要让WebService使用此SSLContext。 一切看起来像这样: 如果我从JUnit测试中调用此代码,则一切正常。它使

  • 问题内容: 请参阅 java.net中 的JAX-WS Maven存储库 -http : //download.java.net/maven/2/com/sun/xml/ws/ 有两个相似的文件夹 -jaxws-rt 和 jaxws-ri 。目前,我正在使用 jaxws-rt ,并且工作正常。 这是我的问题: ri 和 rt有 什么区别? 请问 里 立场 参考实现 及 RT 代表 运行 ? 请指教

  • 在Visual Studio中使用WebService就简单得多。假设引用WebService时的引用名为complexType,则下面的代码调用了uploadImageWithByte方法来上传图像文件。在Visual Studio引用WebService时,uploadImageWithByte方法多了两个out参数,在使用时要注意。 complexType.ComplexTypeServic

  • 在客户端仍然使用了RPC的调用方式,代码如下: package client; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rp

  • 我需要在我的项目中使用一个web服务。我使用NetBeans所以我右键单击我的项目并尝试添加一个新的“Web服务客户端”。上次我检查时,这是创建web服务客户机的方法。但它导致一个AssertionError,它说: java.lang.AssertionError:org.xml.sax.SAXParseException;systemid:jar:file:/path/to/glassfish

  • 我正在测试一个Springmvc控制器,它得到一个网络服务客户端自动配带,它被嘲笑了。但是嘲笑并没有奏效。在测试返回中调用“验证(stuClient,乘以(1))”。获取所有学生(sAndP命令); 下面是我测试中的控制器方法: 下面是我的测试类: