具有Java应用程序和SSL的Web服务客户端

时间:2011-01-18 09:53:49

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

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

2 个答案:

答案 0 :(得分:4)

以下是两种处理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());
    }
}

答案 1 :(得分:3)

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

在调用服务之前使用BindingProvider设置属性。请参阅使用BindingProvider here

的示例