Java SpringX509商店匿名用户CN

Java SpringX509商店匿名用户CN,java,spring,spring-security,x509,Java,Spring,Spring Security,X509,我有一个使用SpringX509保护的SpringBoot应用程序,我对任何想要使用我的API的客户端使用双向SSL证书。API将可用于任何具有有效证书的客户端,但是我希望确保我可以检索客户端证书详细信息以用于审计目的。我有两个可能的解决方案,但每个都有一个问题 首先,我可以配置我的安全设置 http.authorizeRequests().anyRequest().anonymous().and().x509(); 这将确保持有有效证书的任何客户端都可以访问API,但是,因为每当我获得x50

我有一个使用SpringX509保护的SpringBoot应用程序,我对任何想要使用我的API的客户端使用双向SSL证书。API将可用于任何具有有效证书的客户端,但是我希望确保我可以检索客户端证书详细信息以用于审计目的。我有两个可能的解决方案,但每个都有一个问题

首先,我可以配置我的安全设置

http.authorizeRequests().anyRequest().anonymous().and().x509();
这将确保持有有效证书的任何客户端都可以访问API,但是,因为每当我获得x509Certificate对象时,用户都是匿名的,因为它是空的

((X509Certificate) SecurityContextHolder.getContext().getAuthentication().getCredentials()).getIssuerDN().getName()
另一个选项是让我的安全设置如下,并实现一个非常简单的UserDetails服务

http.authorizeRequests().anyRequest().authenticated().and().x509().userDetailsService(myUserService);
我实现的用户服务是:

@Service
public class UserService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) {
         return new User(username,"N/A", Arrays.asList(() -> "ROLE_SSL"));
    }

}

这样可以确保spring存储所有客户端证书详细信息,并且可以使用我前面列出的相同调用来检索。然而,我不喜欢这样一个事实:我被迫实现这样一个简单的userDetailsService,并包含一个不必要的角色。我不需要在spring boot应用程序上存储用户详细信息,也不需要使用UserDetails服务从数据存储中检索任何内容,因此我希望有一种更简单的方法来获取用户x509证书详细信息。有没有更简单的方法可以实现这一点,也许我在http fluent安全调用中错过了一个调用?

使用getIssuerX500Principal()而不是getIssuerDN()。不确定这是否能解决您的问题,但根据javadoc,getIssuerDN()被拒绝接受答案,但SecurityContextHolder.getContext().getAuthentication().getCredentials()为空。但是,如果我决定使用UserDetails驱动程序,我会确保添加您建议的更改。请使用getIssuerX500Principal()而不是getIssuerDN()。不确定这是否能解决您的问题,但根据javadoc,getIssuerDN()被拒绝接受答案,但SecurityContextHolder.getContext().getAuthentication().getCredentials()为空。但是,如果我决定使用UserDetails驱动程序,我会确保添加您建议的更改。