X.509:服务器无法从客户端证书中提取用户信息

时间:2013-06-06 09:59:50

标签: authentication ssl spring-security client-certificates x509

根据Spring Security的说法,我根据需要提供了使用SSL设置,客户端和服务器证书(X.509)的码头,直到这一切看起来一切正常并且通过日志进行验证。

现在!问题是,当我访问安全页面时,客户端(Chrome)正在发送证书,服务器正在成功接收它,但之后它返回给我一个空用户。有没有人知道这里发生了什么?

我提供了一些关于我在这里尝试的信息:

环境

Windows / Jetty(版本:8.1.11.v20130520)/ Spring Security(3.2.0)

码头连接器(版本:8.1.11.v20130520)

<connector implementation="org.eclipse.jetty.server.ssl.SslSocketConnector">
    <port>9443</port>
    <keystore>src/test/resources/server.jks</keystore>
    <needClientAuth>true</needClientAuth>
    <keyPassword>password</keyPassword>
    <password>password</password>
</connector>

安全配置文件

<sec:x509 subject-principal-regex="CN=(.*?)" 
          user-service-ref="myUserDetailsService" />

日志摘录

09:42:24:214 DEBUG org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor(SubjectDnX509PrincipalExtractor.java:43) - 主题DN是'CN = rod,OU = Spring Security,O = Spring框架” 09:42:24:218 DEBUG org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor(SubjectDnX509PrincipalExtractor.java:58) - 提取的主要名称是''

2 个答案:

答案 0 :(得分:2)

您使用的subject-principal-regex是错误的。如果希望日志消息中的DN的提取主体为rod,请将模式设置为CN=(.*?),(请注意末尾的逗号)。顺便说一下,我认为这是默认模式,所以你也可以跳过这个设置。

答案 1 :(得分:0)

元素<security:x509 />用于在spring security中启用X.509身份验证。

元素subject-principal-regex的属性<security:x509 />用于提供正则表达式以从客户端证书中提取用户名。

正则表达式有助于自定义我们想要从客户端证书的对象中提取哪个部分作为我们的用户,如正则表达式中的第一个中间或任何指定,并且由于无效的正则表达式而得到空用户。

此外,属性subject-principal-regex是可选的,如果我们没有明确提供它,那么相应的类(SubjectDnX509PrincipalExtractor)constrtuctor会为它提供以下内容,默认为正则表达式"CN=(.*?)(?:,|$)"