我们在尝试使用Netbeans与Java OpenJDK 14和Apache Tomcat 9连接到Web服务时遇到了问题。这是一个特定的环境,需要Axis 2 1.6.2库才能通过keytool信任的SSL证书连接到WSDL。我们将Axis 2更改为1.7.9,但没有成功。
我们会得到以下错误:
org.apache.axis2.AxisFault: Connection or outbound has closed
org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:78)
org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:84)
com.ctc.wstx.exc.WstxIOException: Connection or outbound has closed
com.ctc.wstx.sw.BaseStreamWriter.finishDocument(BaseStreamWriter.java:1687)
com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:288)
org.apache.axiom.om.impl.MTOMXMLStreamWriter.close(MTOMXMLStreamWriter.java:222)
org.apache.axiom.om.impl.llom.OMSerializableImpl.serializeAndConsume(OMSerializableImpl.java:192)
org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:74)
org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:84)
java.net.SocketException: Connection or outbound has closed
java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:1246)
java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
java.base/java.io.FilterOutputStream.flush(FilterOutputStream.java:153)
我们尝试使用以下代码测试Java主类:
System.setProperty("javax.net.ssl.trustStore", "pathToKeystore");
System.setProperty("javax.net.ssl.keyStorePassword", "myKeystorePassword");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(wsdlDatos);
options.setTo(targetEPR);
options.setTimeOutInMilliSeconds(600000);
clientDatosConsultaDetalles datos = new clientDatosConsultaDetalles();
datos.setUser(usuario);
datos.setPassword(password);
datos.setIpAddress(ip);
System.out.println("Getting service: " + wsdlDatos);
System.out.println(targetEPR.getAddress());
// Generate curp
QName service = new QName("http://services.wserv.ecurp.dgti.segob.gob.mx", "consultarCurpDetalle");
Object[] serviceArgs = new Object[]{datos};
Class[] returnTypes = new Class[]{String.class};
Object[] response = serviceClient.invokeBlocking(service, serviceArgs, returnTypes);
但是,抛出错误的行是最后一行:
Object[] response = serviceClient.invokeBlocking(service, serviceArgs, returnTypes);
防火墙规则已打开,Web服务允许连接到IP地址列表。允许连接我们的IP地址,因此,请告诉我们如何调试此错误?我们认为到Web服务的连接被拒绝,但我们不确定。
编辑:在遵循评论中的建议后,发现这可能是SSL证书的问题,因为使用了jvm参数
-Djavax.net.debug=all
显示以下错误:
java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
我们将keytool与OpenJDK 14一起使用,如下所示:
keytool -import -alias inea -keystore c:\WSCURP\2021\ineacurp.keystore -trustcacerts -file theCer.cer
keystore是用上面的行自动生成的。一个查找人员信息的组织为我们提供了.cer文件。可能我们在导入.cer文件时遗漏了一些关键步骤。
keystore文件内容显示在调试器中,这意味着检测到keystore,并且对该文件具有读/写权限。
奇怪的是,根据调试器,responder_id为空
"status_request_v2 (17)": {
"cert status request": {
"certificate status type": ocsp_multi
"OCSP status request": {
"responder_id": <empty>
还有其他建议吗?
1条答案
按热度按时间um6iljoc1#
在这种情况下,这是一个愚蠢的错误。我希望Netbeans能够识别lib文件夹中的所有内容,因为它是一个导入的Web项目。然而,这并没有发生。Netbeans要求解决缺失的依赖关系,但并不是所有依赖关系都被检测到。缺失的库是javaee-endorsed-api-6.0。
这个项目在编译和运行时都没有抱怨,但是握手无法通信。这可能是axis 2错误的一个替代方法,我在谷歌上搜索它的时候发现它并不常见。