使用双向身份验证时在Servlet中检索客户端证书?

t.p*_*tel 3 java authentication ssl tomcat client-certificates

我正在使用Java和Tomcat 7.0构建Web应用程序。

我在服务器端有一个自签名证书(以后会获得正式证书),并且已将客户端的根证书添加到其信任库中。我已经在3443端口上为https协议设置了必需的双向身份验证,并在server.xml文件中添加了以下几行:

<Connector port="3443" scheme="https" secure="true" SSLEnabled="true" 
        truststoreFile="server.keystore" truststorePass="keystore password" 
        keystoreFile="server.keystore" keystorePass="keystore password" 
        clientAuth="true" keyAlias="serverkey" 
        sslProtocol="TLS"/>
Run Code Online (Sandbox Code Playgroud)

这正在工作,我只能使用有效的证书访问系统。

我现在想知道如何在Servlet上获取该使用过的证书的属性,以便根据用户的证书登录。在此上下文中使用的所有证书将具有不同的CN,因此我想使用该证书来标识用户。

use*_*177 5

您将需要导入java.security.cert.X509Certificate和。在您的doGet(...)方法中,使用以下命令:

String cn = null;
X509Certificate[] certs = (X509Certificate[]) req
    .getAttribute("javax.servlet.request.X509Certificate");
if (certs != null) {
  String dn = certs[0].getSubjectX500Principal().getName();
  // parse the CN out from the DN (distinguished name)
  Pattern p = Pattern.compile("(^|,)CN=([^,]*)(,|$)");
  cn = p.matcher(dn).find().group(2);
} else {
  // no certificate provided
}
Run Code Online (Sandbox Code Playgroud)