2013年12月16日月曜日

独自のSSL証明書で、HTTPS通信をしたい

次のような証明書を受け付けるクラス例です。

-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIJAPMefpUKXulbMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV
...
vHfWjlx0hIVJ7YHycQXny1Io5fQovDSfh6qR1aUTRf6Bg7Ym
-----END CERTIFICATE-----

クラス:
// http://d.hatena.ne.jp/Kazzz/20110320/p1
public class MyHttpClient extends DefaultHttpClient {
 ByteArrayInputStream si;

 public MyHttpClient(String x509) {
  try {
   si = new ByteArrayInputStream(x509.getBytes("UTF-8"));
  } catch (UnsupportedEncodingException e) {
   throw new RuntimeException(e);
  }
 }

 @Override
 protected ClientConnectionManager createClientConnectionManager() {
  SchemeRegistry registry = new SchemeRegistry();
  registry.register(new Scheme("http", PlainSocketFactory
    .getSocketFactory(), 80));
  registry.register(new Scheme("https",
    (SocketFactory) createSSLSocketFactory(), 443));
  return new SingleClientConnManager(getParams(), registry);
 }

 private SSLSocketFactory createSSLSocketFactory() {
  KeyStore keyStore;
  try {
   si.reset();
   CertificateFactory cf = CertificateFactory.getInstance("X.509");
   Certificate oreore = cf.generateCertificate(si);
   keyStore = KeyStore.getInstance("BKS");
   keyStore.load(null, null);
   keyStore.setCertificateEntry("alias", oreore);
   SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore);
   socketFactory
     .setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
   return socketFactory;
  } catch (KeyStoreException e) {
   return null;
  } catch (NoSuchAlgorithmException e) {
   return null;
  } catch (CertificateException e) {
   return null;
  } catch (UnsupportedEncodingException e) {
   return null;
  } catch (IOException e) {
   return null;
  } catch (KeyManagementException e) {
   return null;
  } catch (UnrecoverableKeyException e) {
   return null;
  }
 }
}
使い方:
  return new MyHttpClient(x509);

x509には証明書の文字列を設定してください。

API level 9 準拠

0 件のコメント:

コメントを投稿