【问题标题】:NetBeans: How to create a web service client that consumes a SSL protected Metro service?NetBeans:如何创建使用受 SSL 保护的 Metro 服务的 Web 服务客户端?
【发布时间】:2011-09-28 13:06:49
【问题描述】:

我正在尝试在 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 服务客户端的步骤。第二次创建 Web 服务引用,您可以继续创建客户端。

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

更新

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

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

我必须在 VMargs 中设置 keytore 和 truststore 吗?如果我想在包含 Web 服务的同一个 Web 应用程序中拥有此服务引用怎么办?

【问题讨论】:

  • 我怀疑服务器证书不在客户端信任库中,ssl 握手失败。
  • @Zaki The first time you access this service, accept the certificate (s1as) when you are prompted. 这不会发生,我收到错误消息。我在 .NET 中创建了一个工作客户端,在我在向导中输入 WSDL URL 后它确实提示。

标签: java web-services ssl wsit


【解决方案1】:

找到答案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

我实际上将它们设置在&lt;NETBEANS_HOME&gt;/etc/netbeans.confnetbeans_default_options 中。但是我仍然遇到错误,这只是导致我能够为受 SSL 保护的服务生成客户端代码。运行一个简单的 WS 调用会导致:

重要编辑只有在您使用较旧的 JAX-WS 库时才会发生以下情况!

线程“主”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 应用程序而异。此外,我只是无法使用完全限定的主机名,比如我的本地 IP。唯一有效的是本地主机。一件重要的事情:不要忘记捆绑与服务端相同的 Metro 库! NB bug report.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多