跳到主要内容

X.509 认证

QWen Max 中英对照 X509 X.509 Authentication

X.509 认证

X.509 证书认证最常见的用途是在使用 SSL 时验证服务器的身份,最常见的情况是使用浏览器通过 HTTPS 访问时。浏览器会自动检查服务器提供的证书是否由其维护的受信任证书颁发机构列表中的某一个机构签发(数字签名)。

您还可以使用带有“双向认证”的 SSL。然后服务器在 SSL 握手过程中向客户端请求有效的证书。服务器通过检查客户端的证书是否由可接受的权威机构签名来验证客户端。如果提供了有效的证书,可以通过应用程序中的 servlet API 获取该证书。Spring Security X.509 模块使用一个过滤器提取证书。它将证书映射到应用程序用户,并加载该用户的一组授权,以便与标准的 Spring Security 基础结构一起使用。

您还可以使用带有“双向认证”的 SSL。然后服务器在 SSL 握手过程中向客户端请求有效的证书。服务器通过检查客户端的证书是否由可接受的权威机构签名来验证客户端。例如,如果您使用 Tomcat,您应该阅读 Tomcat SSL 说明。您应该先让它正常工作,然后再尝试与 Spring Security 一起使用。

为您的 Web 应用程序添加 X.509 身份验证

启用 X.509 客户端身份验证非常简单。为此,请将 <x509/> 元素添加到您的 http 安全命名空间配置中:

<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
xml

该元素有两个可选属性:

  • subject-principal-regex。用于从证书的主题名称中提取用户名的正则表达式。默认值如前面的列表所示。这是传递给 UserDetailsService 以加载用户权限的用户名。

  • user-service-ref。这是与 X.509 一起使用的 UserDetailsService 的 bean ID。如果在你的应用程序上下文中只有一个定义,则不需要它。

subject-principal-regex 应该包含一个单独的组。例如,默认表达式(CN=(.*?))匹配通用名称字段。因此,如果证书中的主体名称是 "CN=Jimi Hendrix, OU=…​",则会得到用户名 "Jimi Hendrix"。匹配不区分大小写。因此,"emailAddress=(.*?)," 可以匹配 "EMAILADDRESS=jimi@hendrix.org,CN=…​",从而得到用户名 "jimi@hendrix.org"。如果客户端提供了一个证书,并且成功提取了有效的用户名,则安全上下文中应该有一个有效的 Authentication 对象。如果没有找到证书或找不到相应的用户,则安全上下文将保持为空。这意味着你可以将 X.509 身份验证与其他选项(如基于表单的登录)结合使用。

设置 Tomcat 中的 SSL

Spring Security 示例仓库中有一些预先生成的证书。如果您不想自己生成证书,可以使用这些证书来启用 SSL 进行测试。server.jks 文件包含服务器证书、私钥和颁发机构证书。还有一些来自示例应用程序的客户端证书文件。您可以将这些证书安装在浏览器中以启用 SSL 客户端身份验证。

要运行支持 SSL 的 tomcat,将 server.jks 文件放入 tomcat 的 conf 目录,并在 server.xml 文件中添加以下连接器:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="${catalina.home}/conf/server.jks"
keystoreType="JKS" keystorePass="password"
truststoreFile="${catalina.home}/conf/server.jks"
truststoreType="JKS" truststorePass="password"
/>
xml

clientAuth 也可以设置为 want,如果你仍然希望 SSL 连接成功,即使客户端没有提供证书。未提供证书的客户端无法访问任何由 Spring Security 保护的对象,除非你使用非 X.509 认证机制(例如表单认证)。