spring安全性:使用用户';要根据LDAP进行身份验证的证书

spring安全性:使用用户';要根据LDAP进行身份验证的证书,ldap,spring-security,certificate,x509,Ldap,Spring Security,Certificate,X509,我设法使用证书中的用户名根据Ldap对用户进行身份验证。我希望获得的是直接使用Ldap上的证书对用户进行身份验证。 我找不到如何将证书传递到Ldap 以下是当前配置(使用证书的用户名): 将LDAP服务器设置为使用SSL进行客户端身份验证。将LDAP服务器设置为使用SSL进行客户端身份验证。我自己也在关注这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用

我设法使用证书中的用户名根据Ldap对用户进行身份验证。我希望获得的是直接使用Ldap上的证书对用户进行身份验证。 我找不到如何将证书传递到Ldap

以下是当前配置(使用证书的用户名):



将LDAP服务器设置为使用SSL进行客户端身份验证。

将LDAP服务器设置为使用SSL进行客户端身份验证。

我自己也在关注这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用字符串uid进行查找,但在许多情况下,不可能从X509证书主题中包含的信息中派生出这样的uid(例如,世界上有许多cn=John Smith,甚至在单个组织内,证书DN中也不需要电子邮件)。证书的唯一性在于颁发者+序列号组合,而不是主题

在浏览了API之后,有几种方法可以实现这一点。任何一种方法都可能阻止使用名称空间并自行设置过滤器链和bean:

1) 实现您自己的AuthenticationUserDetails服务,并将其绑定到预验证的身份验证提供程序。我认为,默认情况下,名称空间使用传入的user-service-ref设置UserDetailsByNameServiceWrapper。执行此路径意味着您必须尽一切努力设置UserDetails,包括授予的权限解析。当然,你可以授权所有这些,但这需要更多的工作


2) 如果您的LDAP存储由某个UID设置密钥,而这正是我所倾向的路径,请实现您自己的X509PrincipalExtractor并将其绑定到X509AuthenticationFilter,然后返回LDAPUserDetails服务配置为期望的字符串UID。在提取器中,实现逻辑来搜索LDAP存储以查找存储的证书。我不知道有什么策略可以跨LDAP服务器工作,最简单的方法是,如果您的LDAP支持RFC4523 certificateMatch或certificateExactMatch,并且您可以配置一个搜索筛选器,该筛选器将返回一个唯一的帐户,然后您可以从中返回所需的属性(例如sAMAccountName)。如果不是,则如果您的证书包含可用于检索候选LDAP结果集的筛选值(例如证书cn=LDAP cn),则将其证书提取到X509Certificate并执行.equals()根据传入的证书查找匹配的帐户并返回其uid。

我自己也在研究这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用字符串uid进行查找,但在许多情况下,不可能从X509证书主题中包含的信息中派生出这样的uid(例如,世界上有许多cn=John Smith,甚至在单个组织内,证书DN中也不需要电子邮件)。证书的唯一性在于颁发者+序列号组合,而不是主题

在浏览了API之后,有几种方法可以实现这一点。任何一种方法都可能阻止使用名称空间并自行设置过滤器链和bean:

1) 实现您自己的AuthenticationUserDetails服务,并将其绑定到预验证的身份验证提供程序。我认为,默认情况下,名称空间使用传入的user-service-ref设置UserDetailsByNameServiceWrapper。执行此路径意味着您必须尽一切努力设置UserDetails,包括授予的权限解析。当然,你可以授权所有这些,但这需要更多的工作


2) 如果您的LDAP存储由某个UID设置密钥,而这正是我所倾向的路径,请实现您自己的X509PrincipalExtractor并将其绑定到X509AuthenticationFilter,然后返回LDAPUserDetails服务配置为期望的字符串UID。在提取器中,实现逻辑来搜索LDAP存储以查找存储的证书。我不知道有什么策略可以跨LDAP服务器工作,最简单的方法是,如果您的LDAP支持RFC4523 certificateMatch或certificateExactMatch,并且您可以配置一个搜索筛选器,该筛选器将返回一个唯一的帐户,然后您可以从中返回所需的属性(例如sAMAccountName)。如果不是,则如果您的证书包含可用于检索候选LDAP结果集的筛选值(例如证书cn=LDAP cn),则将其证书提取到X509Certificate,并对传入的证书执行.equals(),以查找匹配的帐户并返回其uid。

最后,我在非web应用程序中实现了以下解决方案:

<bean id="x509ContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldap://hostname:389/DC=base,DC=com" />
    <property name="authenticationStrategy">
        <bean class="org.springframework.ldap.core.support.ExternalTlsDirContextAuthenticationStrategy">
            <property name="sslSocketFactory">
                <bean class="yourOwnSocketFactory"/>
            </property>
            <property name="shutdownTlsGracefully" value="true" />
        </bean>
    </property>
</bean>

其中yourOwnSocketFactory获取用户证书以建立TLS连接

成功的TLS连接意味着用户已通过身份验证。配置良好的LDAP就是这种情况,它应该检查用户,包括证书更新列表


建立连接后,您必须使用自定义BindAuthenticator恢复用户信息,该验证器可以提取(X509T)证书DN(或其他有用信息)以匹配LDAP用户。

最后,我在非web应用程序中实现了以下解决方案:

<bean id="x509ContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldap://hostname:389/DC=base,DC=com" />
    <property name="authenticationStrategy">
        <bean class="org.springframework.ldap.core.support.ExternalTlsDirContextAuthenticationStrategy">
            <property name="sslSocketFactory">
                <bean class="yourOwnSocketFactory"/>
            </property>
            <property name="shutdownTlsGracefully" value="true" />
        </bean>
    </property>
</bean>

其中yourOwnSocketFactory获取用户证书以建立TLS连接

成功的TLS连接意味着