【Java】【JAX-WS】 Webサービス / Metro [6] ~ 証明書未チェックでSSL通信を行う (1) / クライアントサイド ~

動作環境

 + Windows10
 + Tomcat-8.5.8
 + JDK1.8
 + Eclipse Neon

環境設定

 * TomcatでのSSL通信の設定は以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/36513426.html

サンプル

 * ひとまず、オレオレ証明書でも何でも気にせず通すような処理を実装してみる。

サーバ側

 * 以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/36139336.html

クライアント側

import java.net.URL;

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;

public class Main {

  public static void main(String[] args) {
    System.out.println("Start!");
    try {
      // ★SSL通信用の処理★
      
      // Create a trust manager that does not validate certificate chains
      TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
          System.out.println("getAcceptedIssuers");
          return null;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType) {
          System.out.println("checkClientTrusted " + authType);
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType) {
          System.out.println("checkServerTrusted " + authType);
        }
      } };

      SSLContext sslContext = SSLContext.getInstance("TLS");
      HostnameVerifier hostnameVerifier = new HostnameVerifier() {
        public boolean verify(String arg0, SSLSession arg1) {
          System.out.println("verify " + arg0);
          return true;
        }
      };

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

      URL url = new URL("https://localhost:8443/SampleService/service/SampleWebService.ws?wsdl");
      SampleWebServiceService service = new SampleWebServiceService(url);
      SampleWebService proxy = service.getSampleWebServicePort();

      long start = System.currentTimeMillis();
      String result = proxy.sayYourAge("Ken", 11L);
      long end = System.currentTimeMillis();
      System.out.println((end - start) + "ms");

      System.out.println("Result : " + result);
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Done");
  }
}

実行結果

Start!
checkServerTrusted ECDHE_RSA
getAcceptedIssuers
33ms
Result : Ken's age is 11.
Done

トラブル

 * 設定などで起こったトラブルを以下の関連記事にまとめた。
http://blogs.yahoo.co.jp/dk521123/36516104.html


関連記事

Webサービス / Metro [1] ~入門編 / サーバサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36139336.html

Webサービス / Metro [2] ~入門編 / クライアントサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36140561.html

Webサービス / Metro [8] ~ SSL通信を行う (2) / クライアントサイド ~

http://blogs.yahoo.co.jp/dk521123/36528991.html

Tomcat - Javaアプリでの SSL通信時のトラブル

http://blogs.yahoo.co.jp/dk521123/36516104.html

JavaJava で、SSL通信を行うには

http://blogs.yahoo.co.jp/dk521123/33122920.html

Java】 自前認証局(オレオレ証明書) のSSLサーバに接続するには...

http://blogs.yahoo.co.jp/dk521123/35032522.html

Javaアプリにおける SSL通信時のデバッグ方法

http://blogs.yahoo.co.jp/dk521123/35261371.html