Java Soap 通过 https 连接

发布于 2025-01-03 00:39:54 字数 3149 浏览 0 评论 0原文

我正在尝试连接到 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

何以畏孤独 2025-01-10 00:39:54

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文