我有一个场景,我几乎没有其他的Web服务,其中很少需要强制执行相互的ssl,很少有人应该只有一种方式ssl,这里是同一个Web应用程序。
在tomcat / Spring应用程序中可以实现吗?
答案 0 :(得分:3)
很抱歉回复很晚,是的,我这样做了,不确定是不是最好的方式,而是一种黑客攻击。
步骤1:在tomcat中使用clientAuth = want设置SSL的方式。 这将修复您希望为所有Web服务接受需要额外/相互身份验证的网络服务的单向ssl的场景。
步骤2:现在需要相互ssl的Web服务。 编写一个servlet过滤器,并为该特定的Web服务URL检查传入的证书请求。循环遍历请求中找到的证书,并将其与信任库中的证书相匹配。如果找到匹配项,请让请求流继续,如果没有找到SSL证书,则返回异常。
X509Certificate[] certificates = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
上面的代码会在您的请求中为您提供一系列证书。
注意:确保您的SSL配置正确,否则证书变量保持为空。
答案 1 :(得分:0)
如果您可以使用不同的主机(假设客户端和服务器支持SNI)或端口,那么这应该没问题。
不幸的是,您无法根据URL的路径改变SSL配置,因为它仅在建立SSL连接后才可用。在这种情况下,您唯一的选择是使客户端证书可选,并忽略为不需要它的URL发送的任何证书。
在任何一种情况下,你几乎肯定会更好地让像Nginx或Apache httpd这样的东西处理SSL部分,并将有关客户端证书(或缺少证书)的任何数据传递给你的Spring / Tomcat应用程序。 HTTP标头。
答案 2 :(得分:0)
您可以为整个站点使用TLS(&#34;单向&#34;),然后在需要身份验证时才需要客户端证书。将您的TLS <Connector>
clientAuth
属性设置为want
,并将auth-method
中的web.xml
设置为CLIENT-CERT
。应该这样做。