NetBeans:如何创建使用受SSL保护的Metro服务的Web服务客户端?

时间:2011-09-28 13:06:49

标签: java web-services ssl wsit

我正在尝试在NetBeans 7.0.1中为我的应用程序添加Web服务引用。 Metro Web服务受SSL保护,并且托管在我要运行客户端的同一台计算机上。我正在使用“新建Web服务客户端”向导,但是当我提交受SSL保护的WSDL时,我收到以下错误消息:

  

下载wsdl或架构文件时出现问题。

     

检查URL,代理设置或服务器是否正在运行。

     

网址:https://192.168.0.200:8181/MyApp/myService?wsdl

Metro用户指南 - To Secure the Example Web Service Client Application (SSL)声明:

  

在您被指示剪切并粘贴您希望客户端使用的Web服务的URL到WSDL URL字段的步骤中,键入https:// fully-qualified-hostname:8181 / CalculatorApplication / CalculatorWSService? wsdl(以粗体显示的更改)表示此客户端应使用安全端口引用Web服务。第一次访问此服务时,在出现提示时接受证书(s1as)。这是弹出的服务器证书,用于向客户确认其身份。

     

在某些情况下,您可能会收到一个错误对话框,告诉您无法下载URL https:// fully-qualified-hostname:8181 / CalculatorApplication / CalculatorWSService?wsdl。但是,这是正确的URL,并且在您运行服务时会加载。因此,发生此错误时,请使用安全WSDL重复创建Web Service Client的步骤。第二次,创建Web服务引用,您可以继续创建客户端。

无论我尝试多少次,我仍然会收到相同的错误消息(没有代理设置,服务器正在运行并部署了服务)。接受证书后,WSDL将显示在浏览器中。如果我输入基本WSDL URL(没有HTTPS的URL),向导会接受它并生成客户端。我需要做些什么来完成这项工作?

更新

如果我在不同的机器上运行客户端和服务,这同样适用。我正在使用默认开发证书。猎犬输出:

  

错误:发生I / O错误。 sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径。

我是否必须在VMargs中设置keytore和truststore?如果我想在包含Web服务的同一Web应用程序中使用此服务引用,该怎么办?

1 个答案:

答案 0 :(得分:2)

找到答案here

您必须使用以下选项运行NetBeans:

<NETBEANS_HOME>/bin/netbeans.exe
-J-Djavax.net.ssl.trustStore=<AS_HOME>/domains/domain1/config/cacerts.jks 
-J-Djavax.net.ssl.keyStore=<AS_HOME>/domains/domain1/config/keystore.jks 
-J-Djavax.net.ssl.trustStorePassword=changeit 
-J-Djavax.net.ssl.keyStorePassword=changeit

我实际上在<NETBEANS_HOME>/etc/netbeans.conf netbeans_default_options中设置了这些内容。我仍然遇到错误,这只是因为我能够为SSL保护的服务生成客户端代码。运行简单的WS调用会产生以下结果:

编辑重要如果您使用较旧的JAX-WS库,则只会发生以下情况!

  

线程“main”中的异常javax.xml.ws.WebServiceException:找不到'https:// localhost:8181 / myApp / myService?wsdl'wsdl。将资源正确放置在类路径中。

这可以通过使用以下方法设置客户端DATASTOREWS_WSDL_LOCATION属性来解决:

private static URL getURL() {
    try {
        return new URL("https://localhost:8181/myApp/myService?wsdl");
    } catch (MalformedURLException ex) {
        Logger.getLogger(DataStoreWS_Service.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

仅在为简单Java应用程序生成它时才需要这样做,因为生成的客户端代码因Java Web Application而异。此外,我无法使用完全限定的主机名,例如我的本地IP。唯一有效的是localhost。一件重要的事情:不要忘记捆绑与服务端相同的Metro库! NB bug report