【Java】SSL通信を実装する
環境
作業対象ファイル: C:\ssl
JDKのパス: C:\Program Files\Java\jdk1.6.0_45\bin
対象のサーバー証明書名: sample.cer
keyStore と trustStoreとは?
keystore: サーバーに送信するクライアントの証明書を格納するファイル。
trustStore: クライアント側が認証するサーバー側の証明書を格納するファイル。
手順
KeyStoreとTrustStore保存用ディレクトリを作成(C:\ssl)
認証対象のサーバー証明書(sample.cer)を C:\ssl に配置
ターミナルをAdministrator権限で実行し、インストール済みのJDK(C:\Program Files\Java\jdk1.6.0_45\bin)に移動。
以下のコマンドでkeyStoreを新規作成 -storepass の引数がパスワードとなります。
$ keytool -genkey -keystore keystore -storepass hogehoge
※この際、色々と設定を聞かれますが、よしなに...
同じくtrustStoreを新規作成
$ keytool -genkey -keystore truststore -storepass hogehoge
続いて sample.cer を trustStore に以下のコマンドでインポート -alias の引数が管理名として登録されます。
$ keytool -import -trustcacerts -file C:/ssl/sample.cer -keystore "C:/ssl/truststore" -alias sample_ssl
インポートされているかを以下のコマンドで確認
$ keytool -v -list -keystore "C:/ssl/truststore"
インポートされている証明書の一覧が出てくるので、今回追加した sample_ssl が存在していれば成功。
以下サンプルコード
/** * 認証付SSLContext作成 * @param key_path Keystoreファイルのpath * @param key_password Keystoreファイルのpassword * @param trust_path Truststoreファイルのpath * @param trust_password Truststoreファイルのpassword * @return * @throws Exception */ private SSLContext ssl_auth(String key_path, String key_password, String trust_path, String trust_password) throws Exception{ //KeyStore読み込み char[] key_pass_char = key_password.toCharArray(); KeyStore key_store = KeyStore.getInstance("JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); key_store.load(new FileInputStream(key_path), key_pass_char ); kmf.init(key_store, key_pass_char); //TrustStoreの読み込み char[] trust_pass_char =TrustPass.toCharArray();; KeyStore trust_store = KeyStore.getInstance("JKS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); trust_store.load(new FileInputStream(TrustPath), trust_pass_char); tmf.init(trust_store); KeyManager[] key_managers = kmf.getKeyManagers(); TrustManager[] trust_managers = tmf.getTrustManagers(); SSLContext sslcontext = SSLContext.getInstance("TLS"); sslcontext.init(key_managers, trust_managers, null); return sslcontext; } URL urlObj = new URL(url); HttpsURLConnection http = (HttpsURLConnection) urlObj.openConnection(); http.setRequestMethod("POST"); http.setDoOutput(true); http.setConnectTimeout(30000); http.setReadTimeout(30000); http.setSSLSocketFactory(ssl_auth("C:/ssl/keystore", "hogehoge", "C:/ssl/trustStore", "hogehoge").getSocketFactory()); http.connect(); OutputStream os = http.getOutputStream(); PrintStream ps = new PrintStream(os); ps.print("送信するパラメータ"); ps.close();