使用客户端证书身份验证和自定义RDN通过Spring Security保护基于Spring Boot的Web服务

时间:2015-02-11 14:15:25

标签: authentication spring-security spring-boot x509certificate client-certificates

我需要创建由我公司为大多数员工提供的客户端证书保护的 webservices 。由于某些员工没有证书或者有时我们的浏览器无法访问它们,因此身份验证应该是“宽容的”,这意味着至少应该向呼叫者呈现http状态代码401。由于我只提供web服务,员工永远不会直接输入受保护的URL,因此Web服务将始终由可以对401作出反应并显示友好消息的网页调用。

我发现我可以使用Spring Boot /嵌入式Tomcat做clientauth-part。为此我在网上使用了一个例子:

connector.setAttribute("SSLEnabled", true);
connector.setAttribute("sslProtocol", "TLS");
connector.setAttribute("protocol",              "org.apache.coyote.http11.Http11Protocol");
connector.setAttribute("clientAuth", "want");
connector.setAttribute("keystoreFile", absoluteKeystoreFile);
connector.setAttribute("keystoreType", keystoreType);
connector.setAttribute("keystorePass", keystorePassword);
connector.setAttribute("keystoreAlias", keystoreAlias);
connector.setAttribute("keyPass", keystorePassword);

根据我的学习,至少Spring Boot 1.2.1使这一切变得更加容易,因此我将很快切换到使用server.ssl.client-auth=want/need和application.properties中的其他参数。 我当前的设置使用这样的代码来检索证书,当我的公司浏览器调用时,所有这些运行正常:

@RestController
public class WebGedoens {
    @RequestMapping("/")
    String home(HttpServletRequest request) {
        X509Certificate[] certs = (X509Certificate[]) request
                .getAttribute(JAVAX_SERVLET_REQUEST_X509_CERTIFICATE);
        if (certs != null) {
            for (int i = 0; i < certs.length; i++) {
                System.out.println("Client Certificate [" + i + "] = "
                        + certs[i].toString());
            }
        }
...
}

以上转储向我展示了这个主题DN:

Subject: CN=John Doe, EMAILADDRESS=john.doe_17@company.com, O=Company, C=DE

因为有很多“John Does”我需要从主题DN获取EMAILADDRESS RDN,因为电子邮件收到了一个附加号码,可以识别每个独特的人。

如何为我的方法启用Spring Security并告诉Spring Security获取证书(可能有多个)并提取正确的RDN?

0 个答案:

没有答案