【问题标题】:Tomcat + SNI + Mutual AuthenticationTomcat + SNI + 相互认证
【发布时间】:2016-07-15 10:40:28
【问题描述】:

我知道 Tomcat 提供 SNI 和相互身份验证,但是否可以只为选定的应用程序/路径启用 MA? IE。假设我的服务器上有以下应用程序/端点:

/app1
/app2/human
/app2/robot

其中 /app2/human 供人类使用,而 /app2/robot 供机器人、计算机和其他设备使用(例如 /app2/human 提供 HTML和 /app2/robot 提供 JSON)。现在,我能否以某种方式将 Tomcat 配置为通过 SSL 接受与 /app1/app2/human 的连接,而无需 MA 和仅与 /app2/robot 的连接如果客户出示了有效的证书?

当然我想在不为每个应用程序配置单独的端口/连接器的情况下这样做,这很容易。

提前致谢。

【问题讨论】:

    标签: tomcat ssl sni mutual-authentication


    【解决方案1】:

    Tomcat 不为不同的路径提供选择性相互身份验证,但如果您只需要在 webapp 级别(而不是在特定 Web 应用程序内部)应用这种选择性相互身份验证,您可能会能够为特殊的 Web 应用程序使用单独的 <Connector>。这需要一个单独的<Service><Host>,当然还有一个不同的端口号(除非您碰巧有一个单独的网络接口可以用来保留端口)。

    我没试过,但我想理论上可以配置SNI+client-auth,这样一个特定的主机名会有不同的client-authentication要求,但是Tomcat中没有这样的代码目前支持。

    Tomcat 可以配置为对每个主机名使用不同的信任存储和不同的certificateVerification 设置,但它不允许您更改它每个路径

    另一种选择是将 Tomcat 配置为“想要”(甚至要求)客户端证书,然后使用 Filter 自行执行检查。 Filters 可以在每个路径的基础上应用,而且您的应用程序变得更加可移植,因为您不依赖某些可能是 Tomcat 特定的功能。

    看看这个帖子,了解几年前我是如何做到这一点的。 (最终)有一些示例代码以及很多关于我如何将所有信息放在一起的参考:http://markmail.org/thread/vxwwli5nzt4itfr2

    【讨论】:

    • 我认为第二个连接器对于一个非常简单的事情来说是可怕的开销。有了 Mark Thomas 在 Tomcat 9 中添加的 TLS 虚拟主机的所有好东西,对于有需要的人来说,这是一个真正缺少的功能。
    • 我猜只有做出提交的人才能得到爱:(
    【解决方案2】:

    根据this 并通过阅读文档,您不能在每个路径的基础上进行选择性相互身份验证。这是全部或全部,因为客户端身份验证是在连接器级别配置的。您可能正在寻找 SSL renegotation with client auth,它可能没有像您习惯的 Apache HTTPd 那样实现。

    【讨论】:

    • 谢谢,这就是我在查看 SSLSocket、SSLSocketFactory 等类时的想法。似乎可以手动完成,因为它是在您链接的帖子中写的 - 设置“wantClientAuth(true)”而不是“needClientAuth”并执行“手动”验证 - 实际上似乎检查“( (SSLSocket)socket).getSession().getPeerCertificates()" - 如果客户端未通过身份验证,它将抛出异常 javax.net.ssl.SSLPeerUnverifiedException 足以断开连接或返回有意义的东西。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2018-09-02
    • 2012-11-19
    • 2012-09-12
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多