SSLSocket: 任意PATHのストアファイルの使用(2)
例外がなんか気になったので、デフォルトキーストアから エイリアス を抹殺した後、SSLContext#init の引数を全部nullに書き換えて実験プログラムを実行してみた。発生した例外は以下のとおり。
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:622) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) at java.io.OutputStream.write(OutputStream.java:58) at HttpsClientSpecifiedTrustStore.main(HttpsClientSpecifiedTrustStore.java:54) Caused by: sun.security.validator.ValidatorException: No trusted certificate found at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304) at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 9 more
一見して、validatorの型がデフォルト状態では SimpleValidator、KeyStoreを外部から食わせたTrustManagerだと PKIXValidator になっているのが分かる。なんだろう、初期化時のパラメータの違いなのか。ソースを追いつつ、JSSEのドキュメントを見てみたら、TrustmanagerFactoryの初期化パラメータがよろしくなかった(?)模様。
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
これを以下のように修正してやる。
TrustManagerFactory.getInstance("SunX509");
TrustManagerFactory#getDefaultAlgorithm() は "PKIX" を返してたようだ。書き換えた後、実験プログラムを動かすと、無事、デフォルト時と同じような例外が出る事を確認。んっん〜。