Axis 1 https(SSL)client証明書検証エラーValidatorException workaround

2667 ワード

Axis 1.x作成されたクライアントは、httpsのwebserviceをテストするとき、クライアントコードがSSL接続を確立するときにtruststoreを設定していないため、httpsに配備されたwebservice接続は実行時に次のように表示されます.
 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
 
これはAxisのclientがデフォルトのSocketFactoryを使用しているため、server側の証明書を検証します.私たちのテストserverは自己署名で、clientが検出した後、自動的に接続を切断し、握手に失敗しました.
ネット上の多くの解決策はsunのkeytoolでclientTrustStoreとserverTrustStroreを生成し、証明書を導入することです.これらの方法は少し煩雑で、私たちのclientテストクラスはプログラム以外の仕事をする必要はありません.だから、一つの解決策を総合して、この方法を考えました.この方法のインスピレーションはaxisドキュメントのdirty solutionから来ています.
 
核心思想は自分で証明書を検査しないSocketFactoryを作って、このsocket factoryでAxis自身が使っているSocketFactoryを置き換えて、便利のためにMySocketFactoryは直接Axisの親JSSSESocketFactoryを継承します.親メソッドを書き換える
 protected void initFactory() throws IOException

InitFactoryメソッドの内容は、簡単です.checkServer Trusted/checkClientTrustedを何も返さずに、最後の行でこのSslSocketFactoryをカスタムクラスのsslFactory変数に割り当てます.

// Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { // Trust always } public void checkServerTrusted(X509Certificate[] certs, String authType) { // Trust always } } }; // Install the all-trusting trust manager SSLContext sc = SSLContext.getInstance("SSL"); // Create empty HostnameVerifier HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String arg0, SSLSession arg1) { return true; } }; sc.init(null, trustAllCerts, new java.security.SecureRandom());
  sslFactory = sc.getSocketFactory;


Axis clientテストクラスで使用
AxisProperties.setProperty("axis.socketSecureFactory","my.test.MySocketFactory") Axis SocketFactory, server certificate Factory。

 
この解決方法は絶対に簡単で、他の方法と同じようにsunのkeytoolでローカル証明書のインポートを確立し、Axis自身のメカニズムを利用して証明書検証の問題を処理する必要はありません.