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