セットアップ:
- 接続を保護するためにSSLHandlerを使用してNetty(v4.0.8)クライアント/サーバーを使用してセットアップしました。
- Jetty 環境内で Netty パーツを実行しているサーバーでは、クライアントはコマンド ラインから呼び出す JAR です。
- クライアントとサーバーの自己署名証明書があります。
- 両側(サーバーとクライアント)で使用するトラストストアにCA証明書があります。JREキーストアにCA証明書もあります(念のため)
- 私が抱えている問題を追跡するために、独自のトラストストアを実装しています。
問題:
- クライアントとサーバーが同じマシンで実行されている場合、すべて問題ありません。
- クライアントとサーバーが異なるマシンで実行されている場合、最初にサーバーで (次にクライアントで) SSLPeerUnverifiedException を取得します。
- クライアントの Python 実装もあります (SSL 接続を使用)。これ自体は、同じマシンでも別のマシンでも問題なく動作します。
これまでの分析が示している
- Trust-Manager はクライアントとサーバーで getAcceptedIssuers() を正しく呼び出します
- checkServerTrusted() がクライアントで呼び出されます
- サーバー上で checkClientTrusted() が呼び出されない
代わりに、例外が発生します。
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificateChain(SSLSessionImpl.java:401)
これにはサーバーで時間がかかるため、クライアント側ではタイムアウトが発生します
javax.net.ssl.SSLException: handshake timed out
そしてその後
SSLPeerUnverifiedException: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
発生します。
Handler-Class の netty の userEventTriggered() メソッドで例外が発生します。着信イベントが SslHandshakeCompletionEvent であるかどうか、および SSLSession から証明書を取得しようとしたときにチェックします。