У меня есть весеннее загрузочное приложение, предоставляющее REST API (HTTPS), и мне нужна двусторонняя взаимная аутентификация для клиентов.Клиентские сертификаты устанавливаются на складах доверенных сертификатов на стороне сервера.Взаимная аутентификация отлично работает при тестировании клиента и сервера на моем ноутбуке.Однако при развертывании приложения на тестовом сервере все клиентские вызовы отклоняются с помощью протокола HTTP 403 (запрещено) из-за безопасности Spring.В журналах отладки я вижу - "DEBUG osswapxX509AuthenticationFilter - сертификат клиента не найден в запросе."
pom.xml -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
SecurityConfig.java -
@Configuration
@EnableWebSecurity (debug = true)
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/health", "/error", "/ecp**", "/getHtmlStatus", "/callOut")
.permitAll()
.anyRequest()
.authenticated()
.and().x509().subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(userDetailsService());
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (username.equalsIgnoreCase("iwc4-qa.abc.com") ||
username.equalsIgnoreCase("qawr-backend.abc.com")) {
return new User(username, "", true, true, true, true,
AuthorityUtils.createAuthorityList("ROLE_USER"));
} else {
// Throw exception
}
}
};
}
}
application.yml -
spring:
profiles: "e1"
main:
allow-bean-definition-overriding: true
server:
port: 8443
ssl:
client-auth: want
key-store: /opt/app-root/ssl/truststore
key-store-password: Password#123
key-store-type: JKS
ciphers: ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV
trust-store: /opt/app-root/ssl/truststore
trust-store-password: Password#123
trust-store-type: JKS
enabled: true
security:
require-ssl: true
Когда такое же хранилище доверенных сертификатов загружается на локальный компьютер, оно работает нормально.Пробовал с помощью команды curl -
curl -ik --cert iwc_e1_chain.crt --key iwc_e1_key.crt "https://sparc-dev.abc.com/ssltest"
Пожалуйста, помогите.