【发布时间】:2018-12-19 15:45:13
【问题描述】:
双向 SSL(或相互身份验证)通常由服务器在 HTTPS 中指定。例如,this tutorial 解释了如何设置 WildFly 应用服务器以要求 Web 服务客户端在通信期间提供证书。
但是,在我们的例子中,我们需要在客户端强制执行双向 SSL。这意味着我们的客户端配置了客户端证书,以便它可以在握手期间提供证书。如果我们要连接的服务器不要求提供证书,我们想中止通信。
SSL 握手的描述,如标题为“SSL 协议”here(稍远一点)部分中的图表,解释了发生的第一件事是如何选择密码套件:
"1. Client hello - 客户端向服务器发送的信息包括 它支持的最高版本的 SSL 和它的密码套件列表 支持。 (TLS 1.0 表示为 SSL 3.1。)密码套件 信息包括加密算法和密钥大小。”
在 Java 方面(更具体地说:在我的情况下为 CXF),filter cipher suites("cipherSuitesFilter") 是可能的 - 所以我认为可以将密码套件限制为那些需要相互验证。但我没有找到密码套件和双向 SSL 之间的任何链接。例如,this page 注释:
身份验证算法 - 规定服务器身份验证和(如果 需要)将执行客户端身份验证。
我开始认为这意味着密码套件只规定如何客户端身份验证完成,而不是如果需要客户端身份验证。
这让我陷入了死胡同。有没有其他方法可以在客户端强制执行客户端身份验证?
现在我能想到的唯一解决方案是在握手完成后找到正确的钩子方法来实现 SSL 通信,检查连接是否使用客户端身份验证,如果不是,则中止。但是,如果存在这种情况,我想使用任何常见的方法。
【问题讨论】:
标签: java ssl cxf mutual-authentication