Edited at

JVMにオレオレ証明書を恒久的に信頼させる

More than 5 years have passed since last update.


背景


  • オレオレ証明書による https リバースプロキシの裏に Jenkins と GitBucket を設置

  • Jenkins から GitBucket のリポジトリを HTTPS プロトコルで clone しようとした際に Jenkins 内部で SSL ハンドシェイクの例外発生

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

JDK7 以降は Server Name Indicationデフォルトで有効になったため。

使っている証明書がルート認証局に認証されたものであるか、ルート認証局にたどり着けるように中間証明書を結合したものであれば出ないはずです。


回避措置

ローカルで使っているだけなので、 Jenkins の実行に使っている JVM の信頼済キーストアにオレオレ証明書を追加して信頼させておきます。

キーストアファイルは $JAVA_HOME/jre/lib/security/cacerts にあります。

sudo $JAVA_HOME/bin/keytool -importcert -v -trustcacerts\

-file /path/to/server-certificate-file.crt\
-keystore $JAVA_HOME/jre/lib/security/cacerts

例えば /etc/nginx/server.crt を信頼させる場合は

[hidekuro@ubuntu] ~% cd $JAVA_HOME/jre/lib/security


[hidekuro@ubuntu] /usr/lib/jvm/java-8-oracle/jre/lib/security% sudo keytool -importcert -v -trustcacerts -file /etc/nginx/server.crt -keystore cacerts
キーストアのパスワードを入力してください: changeit
所有者: EMAILADDRESS=test@example.com, CN=vm.ubuntu, OU=Foo Department, O=Hoge Comany L=Shinjuku, ST=Tokyo, C=JP
発行者: EMAILADDRESS=test@example.com, CN=vm.ubuntu, OU=Foo Department, O=Hoge Comany L=Shinjuku, ST=Tokyo, C=JP
シリアル番号: e7825960d3da5860
有効期間の開始日: Mon May 26 11:50:14 JST 2014終了日: Wed Jun 25 11:50:14 JST 2014
証明書のフィンガプリント:
MD5: 35:C4:32:65:01:A7:39:BC:0C:47:9D:12:03:E3:53:4E
SHA1: C6:C0:CA:06:3F:5E:91:11:DE:7C:5A:90:52:24:9A:1F:FA:39:7A:88
SHA256: A0:CE:F6:F8:13:94:F3:80:88:F2:01:8E:15:CF:E8:B0:3F:E5:96:0E:D2:3F:40:DD:8A:B6:C0:4A:E8:98:B9:09
署名アルゴリズム名: SHA256withRSA
バージョン: 1
この証明書を信頼しますか。 [いいえ]: y
証明書がキーストアに追加されました
[cacertsを格納中]

JVM のキーストアファイル ${JAVA_HOME}/jre/lib/security/cacerts のデフォルトパスワードは changeit です。

日本語環境にしている場合、証明書を信頼するかどうかの質問が上記のように [いいえ]: となっていますが、返答は はい ではなく y です。念のため。


以上です。