Java 6のCA証明書を書き換える
Java 6 にグローバルサインのルート証明書をインストールする手順
デフォルトのキーストアのパスワードは changeit
1. 新しいルート証明書を作成する
1-1. 追加するルート証明書(.cerファイル)を取得
cd /tmp wget https://jp.globalsign.com/repository/common/cer/rootcacert_r3.cer
1-2. 既存の cacerts を /tmp/cacerts.new にコピー
cp /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/lib/security/cacerts /tmp/cacerts.new
1-3. ルート証明書を keystore に追加
keytool -import -alias GlobalSignRootCA -keystore /tmp/cacerts.new -file /tmp/rootcacert_r3.cer
※ キーストアのパスワード: changeit (デフォルト値)
2. 対象サーバへ適用
2-1. 対象サーバへ cacerts.new をコピーする
scp cacerts.new username@XX.XX.XX.XX:/tmp
2-2. 対象サーバへログイン
ssh username@XX.XX.XX.XX
2-2. rootユーザになる
su -
2-3. 既存の cacerts を cacerts.new に置き換える
cp /tmp/cacerts.new /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/lib/security/ cd /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/lib/security/ mv cacerts cacerts.old ln -s cacerts.new cacerts
2-5. サーバを再起動する
2-4. rootから抜ける
2-6. 対象サーバからログアウト
テストプログラム
接続先は任意に変える。
import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class Test { public static void main(String[] args) throws IOException { String url = "https://www.example.com"; HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); System.out.printf("%d%n", c.getResponseCode()); } }
javac Test.java java Test 200
ルート証明書が古い場合以下のような例外が発生する。
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1697) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:257)