Spring Security x509测试无法按预期工作

时间:2018-08-29 13:07:21

标签: spring spring-boot spring-security x509

我有一个简单的应用程序,用于执行相互TLS 。实际上,在运行该应用程序时,一切都会按我的预期进行。

但是下面的 test 测试不起作用,我想了解原因,因为它似乎进入了安全链,但是 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

编辑:重命名了单元测试功能,以更好地传达测试的意图。

1 个答案:

答案 0 :(得分:0)

原来我的测试课没有正确注释。

在主配置类上,我进行了更改:

Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder

收件人:

@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-${spring.profiles.active}.properties")})
@ComponentScan("foo.bar.blah")
public class Application {

在测试类中,我停止使用 @MockWebMvc 来支持此配置:

@SpringBootApplication(scanBasePackages="foo.bar.blah")
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-${spring.profiles.active}.properties")})
public class Application {

现在配置已正确选择,并且单元测试的行为均符合我的预期。