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()是开始握手的一种方式(请参阅SSLSocket文档的介绍,但不会发生这种情况getHandshakeSession()(如文档所述:“与 getSession() 不同,此方法不会启动初始握手并且在握手完成之前不会阻塞。 ”)。

在大多数情况下,无论如何,您都希望在握手完成后获取客户端证书。调用socket.getSession()而不是socket.getHandshakeSession()(Java 7 中的新增功能)可能会解决您的问题。

于 2013-01-23T20:53:46.660 回答