netbeans 调试错误:连接或出站已关闭,trustAnchors参数不能为空

kiayqfof  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(266)

我们在尝试使用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>

还有其他建议吗?

um6iljoc

um6iljoc1#

在这种情况下,这是一个愚蠢的错误。我希望Netbeans能够识别lib文件夹中的所有内容,因为它是一个导入的Web项目。然而,这并没有发生。Netbeans要求解决缺失的依赖关系,但并不是所有依赖关系都被检测到。缺失的库是javaee-endorsed-api-6.0。
这个项目在编译和运行时都没有抱怨,但是握手无法通信。这可能是axis 2错误的一个替代方法,我在谷歌上搜索它的时候发现它并不常见。

相关问题