Authentication 基于Spring引导的Web服务通过使用客户端证书身份验证和自定义RDN的Spring安全性进行保护

Authentication 基于Spring引导的Web服务通过使用客户端证书身份验证和自定义RDN的Spring安全性进行保护,authentication,spring-security,spring-boot,x509certificate,client-certificates,Authentication,Spring Security,Spring Boot,X509certificate,Client Certificates,我需要创建由我的公司为大多数员工提供的客户端证书保护的Web服务。因为一些员工没有证书,或者有时我们的浏览器无法访问他们,所以身份验证应该是“宽容的”,这意味着至少应该向调用者提供http状态代码401。由于我只提供Web服务,员工永远不会直接输入受保护的URL,因此Web服务将始终由能够响应401并显示友好消息的网页调用 我发现我可以让Spring Boot/嵌入式Tomcat来做clientauth部分。为此,我使用了一个来自web的示例: connector.setAttribute("S

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

我发现我可以让Spring Boot/嵌入式Tomcat来做clientauth部分。为此,我使用了一个来自web的示例:

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());
            }
        }
...
}
因为有很多“John Does”,我需要从主题DN获取电子邮件地址RDN,因为电子邮件收到了一个附加的号码,允许识别每个独特的人

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

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