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" を返してたようだ。書き換えた後、実験プログラムを動かすと、無事、デフォルト時と同じような例外が出る事を確認。んっん〜。