Javaプログラムから https などのSSLサイトへアクセスするプログラムを実行した時、自己証明書などpublicな証明書でない場合は SSLHandshakeException が発生すると思います。
その場合は実行する JRE に該当のSSL証明書をインポートすれば解決します。
SSL証明書をエクスポートする
証明書ファイルが既に手元にある場合、この手順はスキップしてください
- ブラウザの鍵マークをクリック
- SSL証明書をエクスポートする(細かい手順はブラウザによって異なるので省略)
- 拡張子 cer のファイルとしてエクスポートされる
証明書の格納先
JRE の証明書情報は次のファイルに格納されている。
{JAVA_HOME}\jre\lib\security\cacerts
(例)C:\Program Files\Java\jdk1.8.0_171\jre\lib\security\cacerts
コマンドプロンプトを起動する
Program Files 配下のファイルを変更するため、管理者権限が必要
アイコンを右クリックして「管理者として実行」からコマンドプロンプトを実行する
(管理者権限が不要なパスに JDK がインストールされていれば通常起動でもいけるはずだが、未確認)
インポートコマンドを実行する
次のコマンドをコマンドプロンプトから実行すると、証明書がインポートされる
コマンドの書式
keytool は JDK に含まれているので {JAVA_HOME}\bin にPATHが通っているか keytool.exe のフルパスを指定する必要がある
keytool -import -trustcacerts -file [cerファイルのパス] -keystore [cacertsのパス] -alias ca
コマンド例
keytool -import -trustcacerts -file "C:\dev\cert\hoge.cer" -keystore "C:\Program Files\Java\jdk1.8.0_171\jre\lib\security\cacerts" -alias ca
実行
キーストアのパスワードを求められるので、デフォルトの「changeit」を入力する
最後に信頼するか聞かれるので「y」を入力する
キーストアのパスワードを入力してください:
所有者: CN=fujimic.com
発行者: CN=fujimic.com
シリアル番号: 9xxxxxxxxxxxxxx4
有効期間の開始日: Wed Dec 20 17:35:48 JST 2017 終了日: Tue Dec 15 17:35:48 JST 2037
証明書のフィンガプリント:
MD5: 9D:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:B9
SHA1: E1:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:DE
SHA256: 3A:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:56
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.x.xx.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2xxxxxxxx7
]
#2: ObjectId: 2.x.xx.15 Criticality=false
KeyUsage [
Key_CertSign
]
この証明書を信頼しますか。 [いいえ]: y
証明書がキーストアに追加されました
これで自己証明書でもアクセスできるようになったはずです!