2009-06-08 3 views
0

クライアントの証明書がサーバーのトラストストアに存在しない場合でも、TLSサーバーはクライアントからの接続を受け入れます。どうして?TLSサーバーは、クライアントcttificateがサーバーtruststoreに存在しなくても、クライアントからの接続を受け入れますか?どうして?

サーバコード:

tlsContext = SSLContext.getInstance(SSL_PROTOCOL); 
tlsContext.init(getMyKeyManagers(),null,null); 
SSLServerSocketFactory fact = tlsContext.getServerSocketFactory(); 
tlsServerSock = (SSLServerSocket)fact.createServerSocket(); 
tlsServerSock.setNeedClientAuth(true); 
tlsServerSock.setWantClientAuth(true); 
tlsServerSock.bind(objSocketAddress); 

サーバソケットコード上のクライアントコードリスニングを開始:

SSLContext tlsContext = SSLContext.getInstance(SSL_PROTOCOL); 
tlsContext.init(getMyKeyManagers(), getMyTrustManagers(), null); 
SSLSocketFactory fact = tlsContext.getSocketFactory(); 
socket = fact.createSocket(); 
socket.connect(objSocketAddress); 

をコードは、サーバー側で追加なしTrustManagersがない描写として、まだクライアント認証があります成功した。なぜそうですか?

+0

クライアント証明書は、自己署名されている場合にのみサーバートラストストアで必要です。 – EJP

答えて

-1

trustmananagerが存在しない場合、クライアント証明書は必要ありません。

他の勢いは、クライアント証明書の発行者の1人がサーバーのトラストストアに存在することです。 「インストールされているセキュリティプロバイダが最優先の実装のために検索されますので、あなたは、トラストマネージャを設定していない:

+0

これは、truststore @ server側がNULLに設定されていると、匿名クライアントが接続できるようになり、クライアント認証がなくてもtrueに設定されているようです。 –

0

私はこの質問はかなりしばらく前に頼まれたが、それでも;-)

2つの理由が知っています(Javadocから取られています)。おそらくすべてを受け入れることでトラストマネージャーをインストールしたことがあります。

setWantClientAuthtrueに設定して、要件をオプションに設定したため、クライアントはTLSクライアント認証をまったく試行しない可能性があります。これは、setNeedClientAuthtrueの行をオーバーライドした可能性が最も高いです。前者はサーバーにクライアントに「あなたが証明書を持っていれば送信してください」と言い、後者は「証明書を持っていなければ試してみてはいけない」と言います。何らかの理由で、設定されたキーマネージャがTLSクライアント認証用の証明書と秘密鍵を提供しない場合、TLSハンドシェイクは成功します。

TCPスニファ(Wiresharkなど)を使用すると、実際にTLSクライアント認証が行われているかどうかを確認できます。代わりに、システムプロパティー-Djavax.net.debug=allを設定し、STDOUTで多くのデバッグ出力を読み取ることができます(詳細はDebugging SSL/TLS Connectionsを参照してください)

関連する問題