我们有一个java客户端(不是一个Web应用程序,只是一个用Java编写的简单批处理) 必须通过https连接到Web服务。 Web服务位于Apache Tomcat服务器(7.0)中 但我没有直接链接到它,因为有一个IIS反向代理 它通过https公开服务,因此证书位于IIS层 不是在Tomcat。 我注意到WSDL中有一些奇怪的东西,即服务部分仍然有这样的地址
<soap:address location="http://myApp.it:80/Questionario/CallQuestionario"/>
因为它也是类型部分:
<xsd:schema>
<xsd:import namespace="http://www.test.it" schemaLocation="http://myApp:80/Questionario/CallQuestionario?xsd=1"/>
</xsd:schema>
我仍然看到位置和schemaLocation指向http而不是https! 实际上我在尝试连接Web服务时遇到错误: com.sun.xml.internal.ws.client.ClientTransportException:HTTP传输错误:java.net.ConnectException:连接被拒绝:连接
您认为在IIS层中有一些工作要做以解决此问题吗? 即使我尝试使用Soap-UI进行连接,也会出现此错误: java.lang.Exception:无法加载url; https://myApp.it:80/Questionario/CallQuestionario?wsdl,0 - 看起来Web服务的分析失败了。
PS: 相反,如果我使用keytool实用程序为Tomcat创建证书,并且我配置Tomcat编辑server.xml文件,我注意到, 在不更改服务代码的情况下,该部分将在服务和类型部分中使用https中的url值自动更新。 在这种情况下(在https上部署在Tomcat上的Web服务),在使用以下代码行在客户端中导入证书后
System.setProperty("javax.net.ssl.trustStore", "[PATH_TO_THE_CERTIFICATE]");
System.setProperty("javax.net.ssl.trustStorePassword", "[PWD]");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
一切都按预期运作。
答案 0 :(得分:1)
这是预期的。 IIS基本上充当指向Tomcat的代理,因此Tomcat不知道IIS。 Tomcat只通过HTTP公开,因为与IIS的连接可能是HTTPS,但是从IIS到Tomcat都是通过HTTP进行的。
唯一的选择是让IIS与HTTPS Tomcat通信,因此WSDL会正确生成并在WSDL中显示端口8443(默认的Tomcat HTTPS),以便客户端尝试连接时。大多数客户端虽然允许您覆盖WSDL描述中的端口位置并输入您自己的端口位置,但您可以告诉您的WSDL消费者这是他们必须做的事情。