オレオレ証明書を使ってHTTPSをサービスしているサーバに対してコネクションを確立しようとすると以下の例外が発生して接続できない。

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


テストコード

@Test
public void sslErrorTest() throws MalformedURLException, IOException {
try {
new URL("http://kurusugawa.jp").openConnection().getInputStream();
Assert.fail("error case");
} catch (SSLHandshakeException e) {
// OK
}
}

対応方法は2つ。

    1. オレオレ証明書を信用するTrustManagerを自前でつくる
      オレオレ証明書をkeystoreに入れておく

オレオレ証明書を信用するTrustManagerを自前でつくる

@Test
public void sslOreOreTrustTest() throws MalformedURLException, IOException, NoSuchAlgorithmException, KeyManagementException {
SSLContext tSSLContext = SSLContext.getInstance("SSL");
tSSLContext.init(null, new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] aCertificates, String aString) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] aCertificates, String aString) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, new SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(tSSLContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String aHostname, SSLSession aSession) {
return aHostname.equals("kurusugawa.jp");
}
});

new URL("http://kurusugawa.jp").openConnection().getInputStream();
}

オレオレ証明書をkeystoreに入れておく

javaのkeytoolを使って、%JAVA_HOME%/jre/lib/security/cacertsに証明書を追加。

C:>keytool -import -file kurusugawa.jp.Certificate.pem -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
キーストアのパスワードを入力してください: changeit
所有者: CN=kurusugawa.jp, OU=certificate authority, O=Kurusugawa Computer Inc., L=Nagoya, ST=Aichi, C=JP
発行者: CN=oreoreca.kurusugawa.jp, OU=certificate authority, O=Kurusugawa Computer Inc., L=Nagoya, ST=Aichi, C=JP
シリアル番号: 4
有効期間の開始日: Mon Oct 02 00:20:12 JST 2006 終了日: Thu Sep 29 00:20:12 JST 2016
証明書のフィンガープリント:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         署名アルゴリズム名: MD5withRSA
         バージョン: 3

拡張:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: XX XX XX XX XX XX XX XX   XX XX XX XX XX XX XX XX  ................
0010: XX XX XX XX                                        ....
]
]

#2: ObjectId: 0.0.0.0 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: XX XX XX XX XX XX XX XX   XX XX XX XX XX XX XX XX  ................
0010: XX XX XX XX                                        ....
]

[CN=oreoreca.kurusugawa.jp, OU=certificate authority, O=Kurusugawa Computer Inc., L=Nagoya, ST=Aichi, C=JP]
SerialNumber: [    00]
]

#4: ObjectId: 0.0.0.0.0.0.0 Criticality=false

この証明書を信頼しますか? [no]:  yes
証明書がキーストアに追加されました。
カテゴリー: 技術情報

1件のコメント

Javaのkeytoolを使ってEclipseからのアクセスでオレオレ証明書の壁を突破する | shinodogg.com · 2011-12-26 18:57

[…] ローカルのJavaでシカッティングしてやろうと。   ググって一番上に出てきた javaでhttps通信 | 来栖川電算 によると、 javaのkeytoolを使って証明書を追加すればイイっぽい。   FireFoxでそ […]

現在コメントは受け付けていません。