是否有可能根据 URL 同时为同一个 Web 应用程序使用一种方式和相互 SSL
IS it possible to have One way and mutual ssl for same web App same time depending on URLs
我有一个场景,我几乎没有其他 Web 服务,其中很少需要强制执行相互 ssl,很少应该只有一种方式 ssl,这里是相同的 Web 应用程序。
在基于 tomcat/Spring 的应用程序中这可能吗?
如果你可以使用不同的主机(假设客户端和服务器支持SNI)或端口,那么这应该没问题。
遗憾的是,您无法根据 URL 的路径更改 SSL 配置,因为它仅在建立 SSL 连接后才可用。在这种情况下,您唯一的选择是将客户端证书设为可选,并忽略为 URL 发送的不需要它的任何证书。
在任何一种情况下,让 Nginx 或 Apache httpd 之类的东西处理 SSL 部分并将有关客户端证书(或缺少证书)的任何数据传递给您的 Spring / Tomcat 应用程序在 HTTP header.
您可以对整个站点使用 TLS ("one-way"),然后仅在需要身份验证时才要求提供客户端证书。将 TLS <Connector>
的 clientAuth
属性设置为 want
,并将 web.xml
中的 auth-method
设置为 CLIENT-CERT
。应该可以了。
抱歉回复晚了,是的,我这样做了,不确定是否是最好的方法,但有点乱。
第 1 步:在 tomcat 中使用 clientAuth=want 设置 SSL 的一种方式。
这将解决您的场景,您希望所有 Web 服务的一种方式 ssl 接受需要 extra/mutual 身份验证的方式。
第 2 步:现在是需要相互 ssl 的 Web 服务。
编写一个 servlet 过滤器并针对特定的 Web 服务 url 检查传入的 http 证书请求。遍历在请求中找到的证书并将其与来自您的信任库的证书进行匹配。如果找到匹配项,则继续请求流程,否则 return 异常,因为未找到 SSL 证书。
X509Certificate[] certificates = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
以上代码将在您的请求中为您提供证书数组。
注意:确保您的 SSL 配置正确,否则证书变量保持为空。
我有一个场景,我几乎没有其他 Web 服务,其中很少需要强制执行相互 ssl,很少应该只有一种方式 ssl,这里是相同的 Web 应用程序。
在基于 tomcat/Spring 的应用程序中这可能吗?
如果你可以使用不同的主机(假设客户端和服务器支持SNI)或端口,那么这应该没问题。
遗憾的是,您无法根据 URL 的路径更改 SSL 配置,因为它仅在建立 SSL 连接后才可用。在这种情况下,您唯一的选择是将客户端证书设为可选,并忽略为 URL 发送的不需要它的任何证书。
在任何一种情况下,让 Nginx 或 Apache httpd 之类的东西处理 SSL 部分并将有关客户端证书(或缺少证书)的任何数据传递给您的 Spring / Tomcat 应用程序在 HTTP header.
您可以对整个站点使用 TLS ("one-way"),然后仅在需要身份验证时才要求提供客户端证书。将 TLS <Connector>
的 clientAuth
属性设置为 want
,并将 web.xml
中的 auth-method
设置为 CLIENT-CERT
。应该可以了。
抱歉回复晚了,是的,我这样做了,不确定是否是最好的方法,但有点乱。
第 1 步:在 tomcat 中使用 clientAuth=want 设置 SSL 的一种方式。 这将解决您的场景,您希望所有 Web 服务的一种方式 ssl 接受需要 extra/mutual 身份验证的方式。
第 2 步:现在是需要相互 ssl 的 Web 服务。 编写一个 servlet 过滤器并针对特定的 Web 服务 url 检查传入的 http 证书请求。遍历在请求中找到的证书并将其与来自您的信任库的证书进行匹配。如果找到匹配项,则继续请求流程,否则 return 异常,因为未找到 SSL 证书。
X509Certificate[] certificates = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
以上代码将在您的请求中为您提供证书数组。
注意:确保您的 SSL 配置正确,否则证书变量保持为空。