【问题标题】:IS it possible to have One way and mutual ssl for same web App same time depending on URLs是否可以根据 URL 同时为同一个 Web 应用程序提供一种方式和相互 ssl
【发布时间】:2016-01-14 04:36:17
【问题描述】:

我有一个场景,我很少有其他 web 服务,其中很少有人需要强制执行相互 ssl,很少有人应该只使用单向 ssl,这里是相同的 web 应用程序。

这可能在基于 tomcat/Spring 的应用程序中吗?

【问题讨论】:

  • 您是否设法找到问题的解决方案。我还坚持以一种方式仅使用应用程序的 API,而其他方式仅是相互的?
  • 是的,我已经发布了答案现在检查它是否有帮助。

标签: java tomcat ssl spring-security restful-authentication


【解决方案1】:

抱歉回复晚了,是的,我这样做了,不确定是否是最好的方法,但有点像 hack。

第 1 步:在您的 tomcat 中使用 clientAuth=want 设置一种方式 SSL。 这将解决您希望为所有 Web 服务提供一种方式 ssl 接受需要额外/相互身份验证的方式的情况。

第 2 步:现在对于需要相互 ssl 的 Web 服务。 编写一个 servlet 过滤器,并针对该特定 Web 服务 url 检查传入的 http 请求以获取证书。遍历请求中找到的证书并将其与您信任存储中的证书匹配。如果找到匹配项,则继续请求流程,否则返回异常,因为找不到 SSL 证书。

X509Certificate[] certificates = (X509Certificate[]) request
                    .getAttribute("javax.servlet.request.X509Certificate");

以上代码将在您的请求中为您提供证书数组。

注意:确保您的 SSL 配置正确,否则证书变量保持为空。

【讨论】:

  • 感谢您发布答案。我正在使用 spring security 4 +spring boot 并具有 MultiHttpSecurityConfig 实现。但是当我配置 clientAuth=want 时,流程没有到达我的自定义 MultiHttpSecurityConfig 。
  • 不管 clientAuth 值如何,我们都有一个需要相互 ssl 的网络服务,对吗?所以这个网络服务有自己的路径/url。因此,请确保当此路径或 url 被命中时,调用会作为执行 SSL 验证的某个过滤器/类进行。你应该很好。它不会自动调用你的实现,因为我们正在做一个 hack,你可能需要这个特定的网络服务调用通过你自己的路径。
【解决方案2】:

您可以对整个站点使用 TLS(“单向”),然后仅在需要身份验证时才需要客户端证书。将您的 TLS <Connector>clientAuth 属性设置为 want 并将 web.xml 中的 auth-method 设置为 CLIENT-CERT。应该这样做。

【讨论】:

    【解决方案3】:

    如果你可以使用不同的主机(假设客户端和服务器支持SNI)或端口,那么这应该没有问题。

    很遗憾,您不能根据 URL 的路径更改 SSL 配置,因为它只有在建立 SSL 连接后才可用。在这种情况下,您唯一的选择是将客户端证书设为可选,并忽略为不需要它的 URL 发送的任何证书。

    在任何一种情况下,让 Nginx 或 Apache httpd 之类的东西处理 SSL 部分并在 HTTP 标头中将有关客户端证书(或缺少证书)的任何数据传递给 Spring / Tomcat 应用程序几乎肯定会更好。

    【讨论】:

    • 谢谢 Nathan,如果我尝试使用 loadBalancer 根据 url 导航启用双向 https 和 https 端口之间的流量,然后在 web.xml 中如下所示,具体取决于 url 模式强制执行安全约束,/somepath*CONFIDENTIAL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多