Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring security x.509身份验证-根据证书颁发机构接受证书_Java_Spring Boot_Spring Security_X509 - Fatal编程技术网

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

Java Spring security x.509身份验证-根据证书颁发机构接受证书,java,spring-boot,spring-security,x509,Java,Spring Boot,Spring Security,X509,我使用的是Spring Security,它仅在浏览器密钥存储中配置的客户端证书存在于服务器信任存储中时才起作用 目前的工作方式: 我已将SSL客户端身份验证配置为可选(server.SSL.client auth=want,如中所示) 我已配置包含所有客户端证书的服务器信任存储。如果客户端提供的证书位于信任存储中,则会创建相互SSL连接 当我的客户端证书出现在服务器端信任存储中时,Firefox会打开一个带有我的客户端证书的弹出窗口,我可以选择这些证书并建立相互SSL连接 我已经将Sprin

我使用的是Spring Security,它仅在浏览器密钥存储中配置的客户端证书存在于服务器信任存储中时才起作用

目前的工作方式:

  • 我已将SSL客户端身份验证配置为可选(server.SSL.client auth=want,如中所示)
  • 我已配置包含所有客户端证书的服务器信任存储。如果客户端提供的证书位于信任存储中,则会创建相互SSL连接
  • 当我的客户端证书出现在服务器端信任存储中时,Firefox会打开一个带有我的客户端证书的弹出窗口,我可以选择这些证书并建立相互SSL连接
  • 我已经将Spring安全性配置为从客户机证书的SubjectDN中提取用户名,并根据密码进行检查。如果为该用户名返回UserDetails对象,则验证过程将成功完成
问题是,如果我从服务器端信任存储中删除客户端证书,Firefox将不再打开此弹出窗口,并且只进行单向SSL连接。即使根CA证书存在于服务器信任存储中

我想要的是:

  • 仅在服务器信任存储区中存储根证书颁发机构的证书
  • 当客户端在服务器信任存储中提供根CA颁发的证书时,允许相互SSL连接(即使客户端证书不在服务器信任存储中)
我还对互联网上的两个资源感兴趣。在OnBaeldung中,它说所有客户端证书必须存储在服务器信任存储中,X.509Auth才能工作(这证实了我的经验)

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

但是,by"说,

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

这基本上是我想要实现的,但我无法实现

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


我使用的是SpringBoot 1.5.2.RELEASE(SpringSecurityWeb4.2.2.RELEASE)。我已经用Firefox 53测试了我的SSL身份验证工作。

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

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


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

@dur-谢谢,我找到了启用调试的指南,并将尝试调试上面评论中描述的奇怪之处,然后回来发现问题-JVM初始化时,信任存储区只被读取一次。当服务器已经启动并且旧版本在内存中时,我正在修改信任存储。重新启动服务器工作正常。详细说明如何将CA添加到truststore?您是如何管理它的工作的?我的springboot应用程序在truststore中包含自签名根CA,但允许客户端请求密钥由另一根CA签名。这些请求应被拒绝。。。