【问题标题】:Not able to invoke web service无法调用 Web 服务
【发布时间】:2014-10-29 22:36:47
【问题描述】:

我正在尝试调用一个 Web 服务,为此我使用 POST 发送 xml 数据并且我得到了响应。

生产 Web 服务需要我获得的证书。我已将此证书导入我的密钥库并在我的客户端代码中使用它,但我不断收到超时错误。

您知道导致此问题的原因吗?

17:30:15,214 ERROR [stderr] (DefaultQuartzScheduler_Worker-6) java.net.ConnectException: Operation timed out
17:30:15,214 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.PlainSocketImpl.socketConnect(Native Method)
17:30:15,215 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
17:30:15,215 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
17:30:15,215 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
17:30:15,216 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
17:30:15,216 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at java.net.Socket.connect(Socket.java:579)
17:30:15,216 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:618)
17:30:15,216 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:407)
17:30:15,217 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:88)
17:30:15,217 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at hot.com.mhd.erp.action.client.PushStatusClient.pushXML(PushStatusClient.java:478)
17:30:15,217 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at main.com.mhd.erp.sched.StatusPushJob.execute(StatusPushJob.java:73)
17:30:15,218 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
17:30:15,218 ERROR [stderr] (DefaultQuartzScheduler_Worker-6)   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)

公司已将 IP 地址列入白名单且未在防火墙后运行,此连接问题是否与未正确使用的证书有关?我已将它们导入我的密钥库,但我需要在我的代码中或使用 JBoss(托管应用程序)做其他事情

我也这样做来设置密钥库、密码、类型等。

System.setProperty("https.protocols", "SSLv3");
    System.setProperty("javax.net.ssl.trustStore", ERPGetProperty.erpGetProperty("pathToKeyStore"));
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    System.setProperty("javax.net.ssl.keyStore", ERPGetProperty.erpGetProperty("pathToKeyStore"));
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
    System.setProperty("javax.net.ssl.keyStoreType", "JKS"); 

URL url = new URL(address);
    HttpsURLConnection con  = (HttpsURLConnection) url.openConnection();

    con.setConnectTimeout(10000);
    SSLSocketFactory sslSocketFactory  = (SSLSocketFactory) SSLSocketFactory.getDefault();


    con.setSSLSocketFactory(sslSocketFactory);

    con.setRequestMethod("POST");
    con.setUseCaches(true);
    con.setRequestProperty("Content-type", "text/xml");
    con.setRequestProperty("Host", "pwspg.newcorp.com");
    con.setRequestProperty("Content-Length", Integer.toString(xml.length()));
    con.setRequestProperty("SOAPAction", address);
    con.setDoOutput(true);
    con.setDoInput(true);

    userPass = username + ":" + password;
    byte[] encodeBytes = Base64.encodeBase64(userPass.getBytes());
    String encode = new String(encodeBytes);
    con.setRequestProperty("Authorization", "Basic " + encode);

    out = con.getOutputStream();

    out.write(b);

更新:网络服务所有者再次确认我的 IP 地址已被列入白名单。我使用 telnet 测试主机,连接超时。如果我 ping 它,我确实收到了数据包。还有什么可能导致无法连接到 Web 服务的问题?

有人告诉我这与证书无关,但我似乎找不到问题所在。这是我的问题吗?

【问题讨论】:

  • 你不需要像 SSLContext ctx = SSLContext.getInstance("TLS"); 这样的东西吗? ?和 SSLContext.setDefault(ctx);?
  • 我得到 java.lang.IllegalStateException: SSLContextImpl 未初始化
  • 我已经尝试将不同的协议设置为 JVM 参数,但仍然遇到相同的异常。这可能是另一个问题吗?

标签: java web-services ssl keystore client-certificates


【解决方案1】:

我认为这与证书无关。

您是否尝试通过 telnet 从您的主机连接到服务的主机?

$ telnet google.com 443
Trying 173.194.44.133...
Connected to google.com.
Escape character is '^]'.

立即连接。

$ telnet pwspg.newcorp.com 443
Trying 38.176.90.103...

永远等待。会不会出现白名单不成功的情况?

地址

URL url = new URL(address);

明确包含“httpS”和端口号?

【讨论】:

  • 地址是 Web 服务的完整 URL。我将联系网络服务器的所有者并询问 IP 是否被列入白名单。如果 IP 地址被列入白名单,您是否知道可能导致此问题的另一个问题?就像我必须在 ssl 端口上运行 JBoss 一样?
  • IP 地址已成功列入白名单,我从上周五开始一直在尝试解决这个问题,但似乎找不到问题所在。如果这不是服务器端的问题,那么我端的问题可能是什么?没有在防火墙后面运行,互联网速度很快。
  • 这里stackoverflow.com/questions/16895762/… 几乎遇到了同样的问题。也许你可以从中找到一些解决方案。
  • 也许您可以使用 SoapUI 应用程序 (www.soapui.org) 测试您的连接和服务。要设置 ssl 客户端身份验证:geekswithblogs.net/gvdmaaden/archive/2011/02/24/…。但是,应用程序必须从您要访问服务的 IP 地址(主机)运行
  • 感谢您的帮助!我没有网络服务的 wsdl。如果我没有 wsdl,我还能使用 SOAPUI 吗?
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2013-04-02
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多