0

ハンドシェイクが完了したら、サーバーソケットで使用しているgetPeerCertificates()ハンドシェイク(socket.getHandshakeSession())を呼び出しsetNeedClientAuth(true)ます。これにより、クライアント証明書を取得する必要があることがわかります。

何がうまくいかない可能性がありますか?SSLPeerUnverifiedExceptionスローされません

ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();  
serverSocket = (SSLServerSocket)ssf.createServerSocket(PORT);  
serverSocket.setNeedClientAuth(true);
//added to after accept list and picked up by a worker thread.
SSLSocket socket = (SSLSocket) serverSocket.accept();

//worker thread.
SSLSession handshake = socket.getHandshakeSession();
Certificate[] certificates = handshake.getPeerCertificates(); // NULL
4

1 に答える 1

4

に電話をかけるときはsocket.getHandshakeSession()、まだハンドシェイクを開始しておらず、クライアント証明書が交換される時点に到達していないことは確かです。呼び出しgetSession()はハンドシェイクを開始する1つの方法ですが(ドキュメントの概要を参照してくださいSSLSocket、そのようなことは起こりませんgetHandshakeSession()ドキュメントに記載されているように: " getSession()とは異なり、このメソッドは最初のハンドシェイクを開始せず、ハンドシェイクが完了するまでブロックしません。 ")。

ほとんどの場合、ハンドシェイクが完了したら、クライアント証明書を取得する必要があります。socket.getSession()(Java 7での追加)の代わりに呼び出すsocket.getHandshakeSession()と、問題が解決する可能性があります。

于 2013-01-23T20:53:46.660 に答える