上个月,我一直在抨击我的头,试图让一个简单的WebService客户端工作。从JAVA消费安全的Web服务
基本上,我访问的服务需要对XML元素和整个文档进行签名。我已经成功实现了第一步手动(实现算法)和遵循IBM教程。
我一直在寻找如何让第二步的工作信息和所有我能找到的就是以下属性应该设置,无论是通过参数或通过如设置他们在代码:
System.setProperty("javax.net.ssl.keyStoreType","pkcs12");
System.setProperty("javax.net.ssl.keyStorePassword","changeit");
System.setProperty("javax.net.ssl.keyStore","/path/to/keystore");
我不确定这是否足够,但我知道这确实是必要的,因为注释掉这三行会产生java.lang.NullPointerException at sun.security.pkcs12.PKCS12KeyStore.engineGetKey
。
我有一个XML文档,我知道这是有效的测试目的。但是,无论何时通过我自己的应用程序发送WebService,我都无法接受我的请求。我知道这个请求很好,因为它在SoapUI上工作。
我试图让我的代码尽可能短,且目前看起来像如下:
String xml = getXMLToSend(); // Loads the XML I know works
uy.gub.dgi.WSEFacturaEFACRECEPCIONSOBRE params;
params = new WSEFacturaEFACRECEPCIONSOBRE();
Data datain = new Data();
datain.setXmlData(xml);
params.setDatain(datain);
// Do the external call
WSEFacturaEFACRECEPCIONSOBREResponse resp = efacrecepcionsobre(params);
注意:所有这些元素都NetBeans生成从WSDL。
这是结果:
%% Cached client session: [Session-1, TLS_RSA_WITH_AES_256_CBC_SHA]
main, WRITE: TLSv1 Application Data, length = 320
main, WRITE: TLSv1 Application Data, length = 32
main, WRITE: TLSv1 Application Data, length = 288
main, READ: TLSv1 Application Data, length = 144
main, READ: TLSv1 Application Data, length = 64
main, READ: TLSv1 Application Data, length = 4016
main, READ: TLSv1 Application Data, length = 368
main, READ: TLSv1 Alert, length = 32
main, RECV TLSv1 ALERT: warning, close_notify
main, called closeInternal(false)
main, SEND TLSv1 ALERT: warning, description = close_notify
main, WRITE: TLSv1 Alert, length = 32
main, called closeSocket(selfInitiated)
main, called close()
main, called closeInternal(true)
Server : handleFault(): [email protected]
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Error al consumir el Servicio Web
at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:130)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:140)
at com.sun.proxy.$Proxy37.efacrecepcionsobre(Unknown Source)
at xmlsign.XmlSign.efacrecepcionsobre(XmlSign.java:196)
at xmlsign.XmlSign.main(XmlSign.java:110)
我不确定是否我的XML代码应该或不包含标签。 SoapUI需要它们,但我无法让我的代码以任何方式工作。我曾尝试:
- 结束语我在XML标记CDATA
- 直接
- 发送它发送全了SoapUI请求(其中开始像
<soapenv:Envelope xmlns:soapenv=...
)。
SoapUI的工作完美无瑕,我需要做的就是将其设置为使用我的密钥库并为其提供密码。我试图在我的代码中实现相同的行为,但无法找到这样做的方法。这是SoapUI上的设置对话框。
我来,因为我已经尝试过,似乎一切都失败什么下一步做老实无能。
我已经通过使用xmlsec得到了它的工作。谢谢感谢一堆,但! – 2015-02-28 14:53:59