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

问题描述 投票:1回答:0

我需要创建由客户证书保护的Web服务 ,该证书是我公司为大多数员工提供的。 由于某些员工没有证书,或者有时我们的浏览器无法访问他们,因此身份验证应该是“宽容的”,这意味着应至少向呼叫者显示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, [email protected], O=Company, C=DE

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

如何为我的方法启用Spring Security并告诉Spring Security采取证书(可能不止一个)并提取正确的RDN?

authentication spring-security spring-boot x509certificate client-certificates
© www.soinside.com 2019 - 2024. All rights reserved.