У меня есть простое приложение, делающее взаимный TLS . На практике при запуске приложения все работает, как я ожидаю.
Однако этот следующий тест не работает, и я хотел бы понять, почему, как это кажется в цепочке безопасности, но конфигурация truststore , похоже, полностью игнорируется.
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@ContextConfiguration
@WebMvcTest
public class ConfigurationTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Before
public void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
public void untrustedClientShouldBeForbidden() throws Exception {
this.mockMvc.perform(get("/v1/load")
.with(x509(getCertificateFromFile("src/test/resources/untrusted-cert.pem")))
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content("{\"foo\":\"bar\"}"))
.andDo(print())
.andExpect(status().is(HttpStatus.FORBIDDEN.value()));
}
Конфигурация безопасности, которую я имею, очень проста и выглядит следующим образом:
@Override
protected void configure(HttpSecurity http) throws Exception {
//disable crsf and sessions for this web app
http.httpBasic().disable().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and().x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(userDetailsService());
}
И моя тестовая конфигурация (которая работает при выполнении ручного тестирования) выглядит следующим образом (application-test.properties):
server.ssl.trust-store=src/test/resources/test.truststore
server.ssl.trust-store-password=changeit
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
РЕДАКТИРОВАТЬ: переименована функция модульного теста, чтобы лучше передать цель теста.