【问题标题】:Web service client with Java application and SSL具有 Java 应用程序和 SSL 的 Web 服务客户端
【发布时间】:2011-06-10 23:51:32
【问题描述】:

我正在开发一个 Java 桌面应用程序,我想在其中使用一个 Web 服务。 Web 服务需要使用binarysecuritytoken 的具有消息级别安全性的双向 SSL 连接。我将 NetBeans IDE 6.9.1 与 JDK 1.6.0.23 和 JAX-WS 用作 ws 包装器。如何在不使用客户端计算机上的任何 Web 服务器的情况下与 ws 进行通信。我阅读的大部分内容都需要在客户端机器上安装 tomcat 或其他一些 Web 服务器(在 tomcat 中配置密钥库……)。有可能吗?请为 Java 桌面应用程序推荐一些基于 SSL 的 ws 客户端的文章。

【问题讨论】:

  • 简单来说,我需要一个 J2SE 解决方案来使用 SSL 保护的 Web 服务,而不使用任何 J2EE 容器

标签: java web-services ssl jax-ws ssl-certificate


【解决方案1】:

在 JavaSE 中使用 Web 服务 - 请参阅 NetBeans tutorial

在调用服务之前使用BindingProvider 设置您的属性。查看使用BindingProviderhere的示例

【讨论】:

  • 如何使用 BindingProvidor 对 SOAPHeader 进行签名?我想将签名的 SOAPHeader 添加到 JAX-WS 生成的请求/端口。有 BindingProvidor 的扩展,例如 jaxws-rt 中的 WSBindingProvider,但它也使用 J2EE 容器。
  • webservice 发布 WSDL 时,会有安全描述符。然后,您将使用 wsimport 从 WSDL 文档生成客户端工件,然后对其进行适当的配置。这里有一个使用 Netbeans 的简单教程(有点过时,但概念都在那里)(netbeans.org/kb/docs/websvc/wsit.html)。
  • 我上面提到的是消息级别的安全性。如果您只想使用 SSL 保护点对点,请参阅此java-tips.org/java-ee-tips/java-api-for-xml-web-services/…
  • 所以问题没有解决办法。我必须在每台客户端机器上安装一个 Web 服务器(Tomcat)或一个应用程序服务器(Glassfish)来运行一个小型应用程序。即使对于自定义 SoapHeaders,J2SE 中也没有内置机制,必须使用 WSS4J、axis 或 metro(例如访问 BinarySecurityToken 或 SecurityTokenReference)
  • 您在问题中提到您想在 JavaSE 中使用 webservice。在 JDK6 中,有一个 wsimport 工具可以为已部署的服务生成工件。如果部署的服务在 wSDL 中有安全描述符,那么 wsimport 将为您生成一组相应的处理程序,例如 BinarySecurityToken 等。
【解决方案2】:

这里有两种处理 WS over SSL http://ws.apache.org/xmlrpc/ssl.html 的方法。
正确的方法是为 SE 和 EE 解决方案配置和使用您的密钥库。
下一个快速解决方案也适用于我:

package client;

import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.xml.namespace.QName;

import ws.MyService1;
import ws.MyService1ServiceLocator;

public class Client {

    public static void main(String[] args) throws Exception {
        test();
    }

    public static void test() throws Exception {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                // Trust always
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                // Trust always
            }
        } };
        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        // Create empty HostnameVerifier
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        };

        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(hv);

        // use secured service
        QName qname = new QName("http://ws", "MyService1Service");
        String url = "https://127.0.0.1:7002/MyService/wsdl/MyService1.wsdl";
        MyService1 service = new MyService1ServiceLocator(url, qname).getMyService1();
        System.out.println(service.getMessage());
    }
}

【讨论】:

  • 这个答案可以通过提供一些关于 ws.Myservice1 和 ws.MyService1ServiceLocator 实现的细节来改进,因为从提供的解决方案中看不到这一点。
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多