証明書無視のHTTPSクライアント 1.3 & JSSE

import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

import com.sun.net.ssl.HostnameVerifier;
import com.sun.net.ssl.HttpsURLConnection;
import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.X509TrustManager;
import com.sun.net.ssl.internal.ssl.Provider;

public class HttpsClientTest13
{
  public static SSLContext initSSLContext() throws NoSuchAlgorithmException,
      KeyManagementException
  {
    java.security.Security.addProvider(new Provider());
    System.setProperty("java.protocol.handler.pkgs",
        "com.sun.net.ssl.internal.www.protocol");

    SSLContext ssl = SSLContext.getInstance("SSL");
    X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() {
      public X509Certificate[] getAcceptedIssuers()
      {
        return null;
      }

      public boolean isClientTrusted(X509Certificate[] arg0)
      {
        return true;
      }

      public boolean isServerTrusted(X509Certificate[] arg0)
      {
        return true;
      }
    } };
    ssl.init(null, tm, null);

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
      public boolean verify(String host1, String host2)
      {
        return true;
      }
    });
    HttpsURLConnection.setDefaultSSLSocketFactory(ssl.getSocketFactory());

    return ssl;
  }

  public static void exec(String urls, OutputStream out) throws Exception
  {
    SSLContext ssl = initSSLContext();
    URL url = new URL(urls);
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    InputStream in = conn.getInputStream();
    try {
      byte[] b = new byte[1024 * 128];
      int n = -1;
      while ((n = in.read(b)) != -1)
        out.write(b, 0, n);
    } finally {
      in.close();
    }
  }
}

Download JSSE 1.0.3
Download J2SE v 1.3.1_17
via Archive: Java[tm] Technology Products Download


1.3のJavaには、1.4以降と異なりSSLが組み込まれていないため、その分余計な登録手続きが増える。ちなみに1.4以降だと以下のような感じになり、いくらかコードがスッキリする。

import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
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.X509TrustManager;

public class HttpsClientTest14
{
  public static SSLContext initSSLContext() throws NoSuchAlgorithmException,
      KeyManagementException
  {
    SSLContext ssl = SSLContext.getInstance("SSL");
    X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() {
      public X509Certificate[] getAcceptedIssuers()
      {
        return null;
      }

      public void checkClientTrusted(X509Certificate[] arg0, String arg)
      {
      }

      public void checkServerTrusted(X509Certificate[] arg0, String arg)
      {
      }
    } };
    ssl.init(null, tm, null);

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
      public boolean verify(String host1, SSLSession session)
      {
        return true;
      }
    });
    HttpsURLConnection.setDefaultSSLSocketFactory(ssl.getSocketFactory());

    return ssl;
  }

  public static void exec(String urls, OutputStream out) throws Exception
  {
    // 略
  }
}

import先と X509TrustManager、HostnameVerifier の両インターフェースのメソッドシグネチャが微妙に異なっていることに注意。もっとも、1.4以降のJREに添付されている jsse.jar には、JSSE単体配布時代のコードがそのまま残されているので、HttpsClientTest13 クラスは1.4以降でもコンパイル、および動作が可能となっている。