【问题标题】:SOAP Client SSL, failed authenticationSOAP 客户端 SSL,身份验证失败
【发布时间】:2019-01-08 06:47:19
【问题描述】:

我正在组建一个肥皂客户端来调用第三方肥皂服务。我在连接 Java 时遇到问题。它适用于 SoapUI。这是我第一次在应用程序中设置密钥库。我找到的所有代码都是相同且非常简单的,但我无法弄清楚为什么 java 版本无法正常工作。我正在使用我正在尝试连接其服务的公司提供的 TLS pfx 文件. 我从服务器返回 403 .. 这是代码

        URL wsdlLocation = new URL(SECURE_INTEGRATION_WSDL);
        ObjectFactory ofactory = new ObjectFactory();
        HttpsURLConnection httpsConnection = (HttpsURLConnection)wsdlLocation.openConnection();
        char[] password = CLIENT_KEYSTORE_PASSWORD.toCharArray();

        //load keystore
        FileInputStream is = new FileInputStream(new File(CLIENT_KEYSTORE_PATH));
        final KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(is, password);
        is.close();

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

        kmf.init(keystore, password);

        //set the ssl context
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(kmf.getKeyManagers(), null,
                new java.security.SecureRandom());


        httpsConnection.setSSLSocketFactory(sc.getSocketFactory());



        SecureIntegrationServicesImap client = new SecureIntegrationServicesImap(wsdlLocation);


        SesMessage message = ofactory.createSesMessage();

        ReceiveRequest r = ofactory.createReceiveRequest();

        r.setEmail(ofactory.createReceiveRequestEmail("<email ommitted>"));
    ArrayOfMessageSummary messages = client.getWSHttpBindingSecureIntegrationServiceImap().getMessageList(r);
    log.info(messages.getMessageSummary().size());

非常感谢您对我的错误的任何帮助..

不确定是否重要,但服务器是 .NET 平台

这是我得到的堆栈跟踪

javax.xml.ws.WebServiceException: Failed to access the WSDL at: https://<host omitted>/TS?wsdl. It failed with: 
Server returned HTTP response code: 403 for URL: https://<host omitted>/TS?wsdl.
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:265)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:246)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:209)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:178)
at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:363)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:321)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:211)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:207)
at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:114)
at javax.xml.ws.Service.<init>(Service.java:77)
at org.tempuri.SecureIntegrationServicesImap.<init>(SecureIntegrationServicesImap.java:50)
at com.wiredinformatics.utils.SecureExchange.main(SecureExchange.java:127) Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: https://host omitted/TS?wsdl
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at java.net.URL.openStream(URL.java:1045)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:999)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:400)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:231)
... 11 more

【问题讨论】:

  • 您能分享一下您从 Java 获得的异常吗? HTTP 代码 403 表示未授权,因此可能您未正确验证您的 Web 服务,但如果没有更多信息,则很难确定。您要验证的服务器类型是什么?它期望什么类型的授权?
  • 服务器是 .NET,他们为我们提供了 pfx 证书文件/密码。我将堆栈跟踪添加到我的原始帖子中。使用 SoapUI 似乎一切正常
  • 你没有在 socketfactory 上设置协议。添加 javax.net.debug 系统属性并查看 ClientHello 是否使用了正确版本的 TLS。
  • @NathanHughes 协议在 SSLContext.getInstance("TLS") 和 *** ClientHello, TLSv1.2 中设置,这是正确的

标签: java ssl-certificate soap-client


【解决方案1】:

听起来您正在使用基于 TLS 的客户端身份验证。根据您发布的代码,我怀疑问题是您在初始化 httpsConnection 后没有在任何地方使用它。因此,它不会像您期望的那样尝试使用您的客户端证书,而是使用默认的请求上下文设置。

假设您使用的是 JAX-WS,您应该能够使用this answer 中概述的解决方案将您的证书绑定到您的请求上下文(而不是初始化您自己的 HttpsURLConnection):

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

【讨论】:

  • 我使用了静态调用 setDefaultSSLSocketFactory 现在得到一个服务器返回的 HTTP 响应代码:400 for URL:
  • HTTP 400 表示请求错误。这意味着服务器认为您的请求有问题。这意味着什么将取决于您的应用程序。好消息是 400 可能意味着您已正确验证,因为大多数服务器直到您验证后才会验证请求。确保您已经根据正确的 WSDL 构建了绑定,并且您传入的数据是有意义的。
  • 好的。我没有意识到到那时它已经通过了身份验证..我要求我们的客户查看日志中的内容..
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2016-02-22
  • 2015-04-27
  • 1970-01-01
  • 2015-06-13
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多