我计划在Web应用程序中使用基于证书的客户端身份验证。现在我需要一种从客户提供的证书中获取信息的方法。
我如何在服务器端执行此操作?我认为servlet容器(Tomcat)可以验证证书并在HttpServletRequest.getUserPrincipal
中填写Principal还有其他需要考虑的因素吗?
答案 0 :(得分:2)
这实际上取决于证书。您可以在服务器端检查证书的不同字段,如公共名称,组织等。通常,证书中的公用名称(如果是Web服务器)是为其创建证书的域名。如果您确实只想根据证书识别用户,则需要控制证书生成本身,并指定证书autority应该输入的内容(或者更确切地说,创建证书的人,而不是签署证书的人)在哪些领域。您可以同意证书创建者在公共名称字段中输入用户名.www.yourwebsite.com,使公共名称既是唯一的,又具有其中的用户名。但这只有在您控制证书创建时才有可能。
我们自己做了什么,并不依赖于证书字段本身的信息。我们只信任一个特定的证书颁发机构,我们从客户端证书检查指纹,并将我们自己的表映射到用户的证书指纹。然后,Web服务器仅检查客户端是否提供由受信任的证书颁发机构签名的有效证书,如果证书有效,它会在我们的映射表中查找它的指纹。
答案 1 :(得分:2)
我使用Apache + Tomcat执行此操作。 Apache可以使用SSLOptions:
为证书数据创建CGI变量SSLOptions +ExportCertData
Tomcat将数据添加到所有请求属性,您可以使用以下方法获取它:
X509Certificate x509[] = (X509Certificate[])
request.getAttribute("javax.servlet.request.X509Certificate");
我不知道Tomcat如何独立处理客户端证书,但这种方式可靠。