Spring security x.509身份验证 - 根据其颁发者证书颁发机构接受证书

时间:2017-05-03 17:16:02

标签: java spring-boot spring-security x509

我正在使用Spring Security authenticate using an x.509 certificate,只有当服务器信任库中存在浏览器密钥库中配置的客户端证书时,它才有效。

目前的工作方式:

  • 我已将SSL客户端身份验证配置为可选( server.ssl.client-auth = want ,就像在this post中一样)
  • 我已配置包含所有客户端证书的服务器信任库。如果客户端提供的证书位于信任库中,则会创建相互SSL连接。
  • 当我在服务器端信任库中有客户端证书时,Firefox会打开一个带有我的客户端证书的弹出窗口,我可以选择并建立相互SSL连接。
  • 我已将Spring Security配置为从客户端证书的SubjectDN中提取用户名,并根据UserDetailsService进行检查。如果为该用户名返回UserDetails对象,则验证过程将成功完成

问题在于,如果我从服务器端信任库中删除客户端证书,Firefox就不再打开此弹出窗口,只进行单向SSL连接。即使服务器信任库中存在根CA证书。

我想要的是什么:

  • 仅在服务器信任库中存储根证书颁发机构的证书
  • 当客户端在服务器信任库中提供由根CA颁发的证书时,
  • 允许相互SSL连接(即使客户端证书不存在于服务器信任库中)

我也对互联网上的两个资源感兴趣。在Baeldung的this tutorial中,它说所有客户端证书都必须存储在服务器信任库中,以便X.509 auth工作(这证实了我的经验)。

  

您必须记住,对于应由服务器验证的每个用户,需要在配置的信任库中安装自己的证书。对于只有少数客户端的小型应用程序,这可能是切实可行的,随着客户端数量的增加,可能会导致用户进行复杂的密钥管理。

然而,@ this tutorialrobinhowlett表示

  

客户端将其密钥库中的证书提供给服务器,服务器将使用服务器信任库中的CA证书验证客户端证书的链。

这基本上就是我想要实现的目标,但我无法做到。

底线:有人设法在服务器信任库中存储一个或多个根CA证书,并使用这些根CA颁发的客户端证书通过Spring中的X.509相互SSL握手进行身份验证安全

我正在使用Spring Boot 1.5.2.RELEASE(spring-security-web 4.2.2.RELEASE)。我已经使用Firefox 53测试了我的SSL身份验证。

1 个答案:

答案 0 :(得分:1)

我发现了我的问题 - 在服务器启动时我正在修改信任存储(删除客户端证书并只留下CA证书)(在我的情况下是Tomcat)。但是,当JVM初始化时,信任存储保留在内存中并且只读取一次(详细信息on this ServerFault post)。因此,Tomcat在运行时不会读取信任存储更改。

所以答案很简单:是的,如果信任存储中只有CA证书,则在SSL握手期间,服务器与浏览器通信它需要受信任CA颁发的客户端证书,然后浏览器提示用户选择由受信任的CA颁发的证书(如果浏览器密钥库中存在此类证书)。

但是,如果在服务器启动并运行时将CA动态添加到服务器信任库,则不会检测到它。只有在服务器重新启动(并重新初始化JVM)后才能识别新CA.