3

这是来自 Mozilla Crypto Dev ML 的交叉帖子。希望 SO 上的人有一些使用org.mozilla.jss. 链接:JSS-MDN

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

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

我的问题是客户端证书“A”同时用于连接“A”和“B”。

我一直在使用这个构造函数:

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()在远程服务器请求证书时触发本机回调代码运行?

谢谢,

公关

4

1 回答 1

2

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

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

于 2011-09-07T19:07:39.910 回答