Java Soap 通过 https 连接
我正在尝试连接到 https url - https://rtpubcommission.api.cj .com/wsdl/version2/realtimeCommissionServiceV2.wsdl
但是出现错误(仅列出错误链,没有完整的堆栈跟踪):
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: algorithm check failed: MD2withRSA is disabled
Caused by: java.security.cert.CertPathValidatorException: algorithm check failed: MD2withRSA is disabled
这是我的 代码:
private void processCommonRequest(String url, HashMap<String, String> params) throws Exception {
URL endpoint = new URL(url);
//MessageDigest md = MessageDigest.getInstance("MD5");
//System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
//Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
// Create SOAP connection
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection connection = scf.createConnection();
// Create a message from the message factory.
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();
// Get the SOAP Part from the message
SOAPPart soapPart = msg.getSOAPPart();
// Get the SOAP Envelope from the SOAP Part
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/1999/XMLSchema");
envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/1999/XMLSchema-instance-instance");
envelope.addNamespaceDeclaration("tns", "http://api.cj.com");
envelope.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
// Remove empty header from the Envelope
envelope.getHeader().detachNode();
// Create a soap body from the Envelope.
SOAPBody body = envelope.getBody();
body.addNamespaceDeclaration("soap-env", "http://schemas.xmlsoap.org/soap/encoding/");
// SOAPBodyElement item = body.addBodyElement(envelope.createName("GeScore") );
SOAPBodyElement item = body.addBodyElement(envelope.createName(
"GeScore", "soap-env", "http://schemas.xmlsoap.org/soap/encoding/"));
for (String keyMap : params.keySet()) {
addItem(envelope, keyMap, params.get(keyMap), item);
}
System.out.println("\nContent of the message: \n"); // FIXME
msg.writeTo(System.out);
// Send the SOAP message and get reply
System.err.println("\nSending message to URL: " + endpoint); // XXX
SOAPMessage reply = connection.call(msg, endpoint);
// ... nevermind what later ... .call function throws error ....
connection.close();
}
I'm trying to connect to https url - https://rtpubcommission.api.cj.com/wsdl/version2/realtimeCommissionServiceV2.wsdl
But getting the errors (listed only chain of errors, without full stacktrace):
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: algorithm check failed: MD2withRSA is disabled
Caused by: java.security.cert.CertPathValidatorException: algorithm check failed: MD2withRSA is disabled
Here is my code:
private void processCommonRequest(String url, HashMap<String, String> params) throws Exception {
URL endpoint = new URL(url);
//MessageDigest md = MessageDigest.getInstance("MD5");
//System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
//Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
// Create SOAP connection
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection connection = scf.createConnection();
// Create a message from the message factory.
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();
// Get the SOAP Part from the message
SOAPPart soapPart = msg.getSOAPPart();
// Get the SOAP Envelope from the SOAP Part
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/1999/XMLSchema");
envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/1999/XMLSchema-instance-instance");
envelope.addNamespaceDeclaration("tns", "http://api.cj.com");
envelope.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
// Remove empty header from the Envelope
envelope.getHeader().detachNode();
// Create a soap body from the Envelope.
SOAPBody body = envelope.getBody();
body.addNamespaceDeclaration("soap-env", "http://schemas.xmlsoap.org/soap/encoding/");
// SOAPBodyElement item = body.addBodyElement(envelope.createName("GeScore") );
SOAPBodyElement item = body.addBodyElement(envelope.createName(
"GeScore", "soap-env", "http://schemas.xmlsoap.org/soap/encoding/"));
for (String keyMap : params.keySet()) {
addItem(envelope, keyMap, params.get(keyMap), item);
}
System.out.println("\nContent of the message: \n"); // FIXME
msg.writeTo(System.out);
// Send the SOAP message and get reply
System.err.println("\nSending message to URL: " + endpoint); // XXX
SOAPMessage reply = connection.call(msg, endpoint);
// ... nevermind what later ... .call function throws error ....
connection.close();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
MD2 不再安全,因此 Sun 禁止在证书路径验证中使用它。在安全更新 6u17 的发行说明中,http://java.sun.com/ javase/6/webnotes/6u17.html,据说该漏洞已得到解决,“6861062:在证书链验证中禁用MD2”。
您可以在旧版本的 JRE(6u17 之前)上运行代码,也可以尝试最新版本,因为有一些报告表明它可能有效(https://forums.oracle.com/forums/thread.jspa?threadID=1237743 )。
或者,您可以尝试使用自定义 TrustManager,但如果安全性对您很重要,则不建议这样做。
The MD2 is not secure any more, so Sun disabled its use in certification path validation. In the Release Notes of security update 6u17, http://java.sun.com/javase/6/webnotes/6u17.html, it is said that the vulnerability is addressed, "6861062: Disable MD2 in certificate chain validation".
You could either run your code on older version of JRE (before 6u17) or try latest version instead, as there are some reports that it might work (https://forums.oracle.com/forums/thread.jspa?threadID=1237743).
Alternatively you could try to use custom TrustManager, although it's not recommended if security is important for you.