X.509 인증서를 사용한 스프링 보안
-
19-09-2019 - |
문제
나는 애플리케이션을 보호하기 위해 Spring Security 3.0.0을 구성하려고 천천히 미쳐가고 있습니다.
클라이언트 인증(스마트 카드 사용)을 요구하도록 서버(부두)를 구성했습니다.그러나 applicationContext-security.xml 및 UserDetailsService 구현을 제대로 얻을 수 없는 것 같습니다.
먼저 애플리케이션 컨텍스트 파일에서 다음을 수행합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<security:global-method-security secured-annotations="enabled" />
<security:http auto-config="true">
<security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="accountService" />
</security:http>
<bean id="accountService" class="com.app.service.AccountServiceImpl"/>
UserDetailsService는 다음과 같습니다.
public class AccountServiceImpl implements AccountService, UserDetailsService {
private static final Log log = LogFactory.getLog(AccountServiceImpl.class);
private AccountDao accountDao;
@Autowired
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException, DataAccessException {
log.debug("called loadUserByUsername()");
System.out.println("called loadByUsername()");
Account result = accountDao.getByEdpi(s);
return result;
}
}
애플리케이션에는 로그인 버튼이 있는 "첫 페이지"가 있으므로 해당 페이지에 액세스하려면 어떤 종류의 인증도 필요하지 않습니다.
도움을 주시면 감사하겠습니다.
해결책
애플리케이션에는 로그인 버튼이 있는 "첫 페이지"가 있으므로 해당 페이지에 액세스하려면 어떤 종류의 인증도 필요하지 않습니다.
여기에 문제가 있습니다.서블릿 컨테이너를 다음과 같이 설정한 경우 필요하다 클라이언트 인증에서는 이러한 개방형 페이지를 가질 수 없습니다. 이 경우 스마트 카드가 없는 사용자에 대한 인증 핸드셰이크가 성공하지 못하고 컨테이너 오류 페이지도 표시되지 않습니다. 대신 브라우저 오류가 발생합니다.
컨테이너를 만들어서 할 수 있습니다. 허용하다 클라이언트 인증 및 로그인 페이지를 익명 사용자에게 공개하고 SpringSec을 통해 다른 페이지를 보호합니다.하지만 스마트카드-PKI 앱에는 이 방법을 권장하지 않습니다.스마트 카드 인증은 보안 중요성을 의미하며 스마트 카드가 아닌 사용자를 컨테이너 핸드셰이크 초기에 폐기하는 것이 더 안정적입니다.이 경우에도 앱에 연결된 "로그인" 버튼을 사용하여 다른 포트에서 사용자 친화적인 로그인 페이지를 가질 수 있습니다.
SpringSecurity 설정에 도움이 필요하면 게시물에 문제에 대한 추가 정보를 추가하세요.
다른 팁
구성 관점에서 보면 괜찮아 보입니다.어떤 오류가 표시되나요?UserDetailsService가 X.509 인증서의 CN으로 호출되는 것을 보고 계십니까?