Tomcat + SNI + 相互认证

Tomcat + SNI + Mutual Authentication

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

/app1
/app2/human
/app2/robot

其中 /app2/human 供人类使用,/app2/robot 供机器人、计算机和其他设备使用(因此,例如 /app2/human 服务于 HTML,而 /app2/robot 服务于 JSON)。现在,我能否以某种方式配置 Tomcat 以在没有 MA 的情况下通过 SSL 接受与 /app1/app2/human 的连接以及 /app2/robot 仅当客户出示有效证书时?

当然我想不用为每个应用单独配置ports/connectors,这很简单。

提前致谢。

根据 this and by reading the docs, you cannot have selective mutual auth on a per-path basis. It is all or nothing because client auth is configured at connector level. You are probably looking for SSL renegotation with client auth 可能未实现,因为您可能已经习惯了 Apache HTTPd。

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

我没试过,但我想理论上可以配置 SNI+client-auth,这样一个特定的主机名会有不同的客户端身份验证要求,但没有Tomcat 中的此类代码当前支持该代码。

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

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

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