这是来自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)
我还实现了接口SSLClientCertificateSelectionCallback
(source),以便使用上面的构造函数并传递正确的客户端证书。此外,我在实现的SSLClientCertificateSelectionCallback
select()
函数中放置了一行,以记录执行回调的时间。
运行我的应用程序并检查日志,select()方法只在创建第一个SSLSocket(选择客户端证书'A')期间调用一次,而在指定客户端证书B昵称时从未在未来的SSLSocket实例化中调用。事实上,我必须重新启动select()
的应用才能再次运行。
当远程服务器请求证书时,有没有办法可以触发本机回调代码来运行select()
?
谢谢,
PR
答案 0 :(得分:2)
听起来可能会有一些会话缓存正在进行中。你说你使用SSLSocket。您是否尝试将会话缓存设置为false?默认情况下,SSLSocket启用会话缓存。
例如在SSLSocket类中,有方法public void useCache(boolean b)
如果你设置在创建套接字后传递false
参数,希望这会阻止服务器缓存你的第一个会话(我假设你从一个程序调用两个客户端连接)。这样,它应该提示您从第二个连接中获取另一个证书请求。