我正在尝试编写一个客户端(实际上是一个中间件,它是一个实体的客户端,但也充当其他人的服务器).在其客户端容量中,它应该与另一台服务器(VMware的VirtualCenter)通信,并要求它代表它做一些事情.
为了提供更多上下文,VirtualCenter允许应用程序注册为扩展.所述申请可以在注册时注册其证书(setCertificate).之后,应用程序可以使用其证书(loginExtensionByCertificate()方法)登录VirtualCenter ,从而无需存储用户名和密码.但是,为了使其正常工作,客户端(我的应用程序)必须发送证书作为其SSL连接的一部分,即使服务器(VirtualCenter)没有特别要求它.
我正在用Java编写我的应用程序.创建了我自己的密钥管理器,将其连接到我的密钥库并指定要使用的别名.然后初始化我的ssl上下文以使用该密钥管理器.在创建的套接字中,我确实看到他们的SSLContext中有我的密钥管理器.但是,我没有看到密钥管理器被调用来获取证书.出于某种原因,套接字不觉得需要发送证书.
我知道服务器可能会要求客户端提供其证书.在这种情况下,它不会发生.我想知道是否有办法强制创建的套接字提供证书,无论服务器是否要求它.
仅当服务器请求时才能发送客户端证书。请参阅TLS 规范。- 客户端证书消息(RFC 4346,第 7.4.6 节):
这是客户端收到服务器问候完成消息后可以发送的第一条消息。仅当服务器请求证书时才会发送此消息。
如果服务器尚未请求客户端证书,则您无法强制客户端发送客户端证书。
编辑:当然,您还需要确保您的密钥管理器/密钥库设置正确。您可能会遇到与为什么 java 在 SSL 握手期间不发送客户端证书?中描述的问题类似的问题。
但是,要实现此功能,客户端(我的应用程序)必须发送证书作为其 SSL 连接的一部分,即使服务器(VirtualCenter)没有特别要求它
为此,服务器必须请求它。SSL 协议就是这样定义的。如果您可以安排客户端主动发送数据(但您不能这样做),那么服务器必然会断开连接。
解决这个问题的方法是在服务器端。你百分百确定它不是在问吗?也许它在询问,但您的客户没有发送?例如,因为证书不是由服务器信任的 CA 签名的。
归档时间: |
|
查看次数: |
7091 次 |
最近记录: |