使用登录名和密码或证书进行身份验证

Posted

技术标签:

【中文标题】使用登录名和密码或证书进行身份验证【英文标题】:Authenticaton with login and password or with certificate 【发布时间】:2021-08-09 05:00:30 【问题描述】:

我有一个带有 spring boot 的应用程序,用户可以使用登录名和密码或数字证书进行身份验证。 我尝试使用用户名和密码进行验证,但当我尝试使用证书进行验证时,chrome 不会显示窗口来选择我想在验证中使用的证书(我有多个证书并且服务器是安全的,等等。 ..)

有什么想法吗? 我附上我的 WebSecurityConfigurerAdapter 的代码,以防我出错

> @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
@Slf4j
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 





    @Configuration
    @Order(2)
    public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter 
        @Autowired
        CustomAuthenticationProvider customAuthProvider;

        @Override
        public void configure(HttpSecurity http) throws Exception 
            http.authorizeRequests()
                    .mvcMatchers(PublicUrls.URLS).permitAll()
                    .anyRequest().fullyAuthenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .defaultSuccessUrl("/")
                    .permitAll()
                    .and()
                    .cors()
                    .and()
                    .logout()
                    .invalidateHttpSession(true)
                    .clearAuthentication(true)
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .logoutSuccessUrl("/login?logout")
                    .permitAll();

        
        protected void configure(AuthenticationManagerBuilder auth) throws Exception 
            auth.authenticationProvider(customAuthProvider);
        
    
        @Configuration
        @Order(1)
        public static class UserSecurityConfig extends WebSecurityConfigurerAdapter 


            @Autowired
            CustomAuthenticationProvider2 customAuthProvider2;


            @Override
            protected void configure(HttpSecurity http) throws Exception 

                http.antMatcher("/loginCert*").authorizeRequests()
                        .mvcMatchers(PublicUrls.URLS).permitAll()
                        .anyRequest().fullyAuthenticated()
                        .and().x509()
                        .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
                        .userDetailsService(userDetailsService());
            

            protected void configure(AuthenticationManagerBuilder auth) throws Exception 
                auth.authenticationProvider(customAuthProvider2);
            

        




    @Bean("authenticationManager")
    @Override
    protected AuthenticationManager authenticationManager() throws Exception 
        return super.authenticationManager();
    

配置属性为:

server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit server.ssl.enabled=true server.ssl.client-auth=需要 server.port=8443

【问题讨论】:

“导航器不显示窗口”是什么意思?你在使用浏览器吗?客户端应用程序?邮递员 ***.com/questions/33808603/… 的可能重复项 我使用谷歌浏览器并且不显示您选择要在验证中使用的证书的典型窗口 【参考方案1】:

让浏览器提示您输入客户端证书 如果使用嵌入式 tomcat,则需要在 application.properties 中设置以下 Spring 属性

server.ssl.client-auth=need

对于专用 tomcat,您需要在 server.xml 中设置以下属性

clientAuth="want"

参考以下教程设置双向认证/2-way SSL

https://www.baeldung.com/x-509-authentication-in-spring-security

【讨论】:

当我在 goolge chrome 中尝试此操作时,它会响应以下消息:安全连接失败连接到 localhost:8443 期间发生错误。 SSL 对等方无法验证您的证书。错误代码:SSL_ERROR_BAD_CERT_ALERT 您尝试查看的页面无法显示,因为无法验证接收数据的真实性。请联系网站所有者告知他们这个问题。 我使用了以下证书:github.com/eugenp/tutorials/tree/master/spring-security-modules/… 我建议您按照答案中链接的教程处理任何后续错误。如果您的原始问题得到解答,请接受答案并投票 还有一个问题...有什么方法可以将证书传递给 userDetailService 进行一些自定义验证?

以上是关于使用登录名和密码或证书进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过 PHP 会话进行服务器身份验证

双因素身份认证

Web API 身份验证(无 asp.net 身份)

通过电子邮件/密码进行身份验证的颤振问题

在 ionic 3 应用程序中使用 JWT 进行身份验证

sql server不能用windows身份登录