选择客户端证书的JSS SSLSocket问题

时间:2011-09-07 18:10:39

标签: java sockets cryptography nss

这是来自Mozilla Crypto Dev ML的交叉帖子。希望有人在SO上有使用org.mozilla.jss的经验。 Link: JSS - MDN

我正在尝试分别使用两个客户端套接字和两个不同的客户端证书(客户端证书A和B)向远程主机发出两个单独的HTTPS请求。我的测试程序是SSLTest.java

的修改版本

从我的主机,我可以在远程主机的两个不同套接字上建立两个连接。我能够从远程Web服务器接收200 OK以用于单个连接。

我的问题是客户端证书'A'正用于连接'A'和'B'。

我一直在使用this构造函数:

public SSLSocket(java.lang.String host,int port, 
java.net.InetAddress localAddr, 
int localPort, 
SSLCertificateApprovalCallback certApprovalCallback, 
SSLClientCertificateSelectionCallback clientCertSelectionCallback)

我还实现了接口SSLClientCertificateSelectionCallbacksource),以便使用上面的构造函数并传递正确的客户端证书。此外,我在实现的SSLClientCertificateSelectionCallback select()函数中放置了一行,以记录执行回调的时间。

运行我的应用程序并检查日志,select()方法只在创建第一个SSLSocket(选择客户端证书'A')期间调用一次,而在指定客户端证书B昵称时从未在未来的SSLSocket实例化中调用。事实上,我必须重新启动select()的应用才能再次运行。

当远程服务器请求证书时,有没有办法可以触发本机回调代码来运行select()

谢谢,

PR

1 个答案:

答案 0 :(得分:2)

听起来可能会有一些会话缓存正在进行中。你说你使用SSLSocket。您是否尝试将会话缓存设置为false?默认情况下,SSLSocket启用会话缓存。

例如在SSLSocket类中,有方法public void useCache(boolean b)如果你设置在创建套接字后传递false参数,希望这会阻止服务器缓存你的第一个会话(我假设你从一个程序调用两个客户端连接)。这样,它应该提示您从第二个连接中获取另一个证书请求。