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)