当前位置: 首页 > 知识库问答 >
问题:

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

西门正平
2023-03-14

我使用Spring Security使用x.509证书进行身份验证,它仅在浏览器密钥存储库中配置的客户端证书存在于服务器信任存储库中时才工作。

它目前是如何工作的:

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

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

我想要的:

  • 仅在服务器信任存储区中存储根证书颁发机构的证书

我还对互联网上的两个资源感兴趣。在关于Baeldung的本教程中,它说所有客户端证书必须存储在服务器信任存储中,X.509 auth才能工作(这证实了我的经验)。

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

然而,@robinhowlett的这篇教程说

客户机将在其密钥库中向服务器出示其证书,服务器将使用服务器信任库中的CA证书验证客户机证书链。

这基本上是我想实现的,但我不能。

一句话:是否有人在服务器信任存储中存储了一个或多个根CA证书,并使用这些根CA颁发的客户端证书在Spring Security中通过X.509相互SSL握手进行身份验证?

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

共有1个答案

花玄裳
2023-03-14

我发现了我的问题——我在服务器运行时(在我的例子中是Tomcat)修改了信任存储(删除客户端证书,只留下CA证书)。但是信任存储被保存在内存中,并且在JVM初始化时只读取一次(详细信息见本文)。因此,Tomcat不会在运行时读取信任存储更改。

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

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

 类似资料:
  • 问题内容: 我想使用TLS相互身份验证来验证go制成的API上的客户端。我创建了一个证书颁发机构,假设鲍勃有一个他想与客户端一起使用的密钥对。鲍勃(Bob)创建了一个证书请求,希望我验证他的证书,以便在API上进行授权和身份验证。 我用它来创建我的证书颁发机构: Bob用它来创建他的证书和证书请求: 我想实现这一目标,但是请继续: 现在,通过这些命令,Bob可以使用此tls.Config创建到我的

  • 我正在使用X509Certificates实现通信,并正在努力验证证书。 下一个问题:需要验证签名的证书,并对照父证书进行检查,但在执行此操作时,如下所示: 它抛出,签名错误,java.security.SignatureException:签名不匹配。 是否有其他方法,我应该检查发行人或验证证书?我错过了什么吗? 亨里克·贝斯特

  • 我想使用TLS相互身份验证在Go中制造的API上对一个客户端进行身份验证。我已经创建了一个证书颁发机构,假设Bob有一个他想与客户机一起使用的密钥对。Bob创建了一个证书请求,并希望我验证他的证书,以便在API上进行授权和身份验证。 我已使用此方法创建了我的证书颁发机构: Bob使用它来创建他的证书和证书请求: 我想实现这一点,但在围棋: 但如果朱莉娅现在想登录怎么办?她将必须创建一个CSR,发送

  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 您应该使用什么方式与您的证书颁发机构签署证书请求?一种方法比另一种方法好吗(例如,一种方法被弃用)?