オレオレ証明書を使って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つ。
-
- オレオレ証明書を信用する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でそ […]