春季启动x509测试-pcf

时间:2018-11-15 09:09:39

标签: spring-boot spring-security cloudfoundry mutual-authentication

Cloud Foundry 中,我对其进行了配置,以便将客户端证书转发到我的spring boot应用程序。

证书放置在x-forwarded-client-cert头中,Spring Boot应用程序读取此消息,并检查CN是否已列入白名单并发送适当的响应。不幸的是,我无法通过测试来复制这种行为。我一直在获取(在调试输出中):

  

“在请求中未找到客户端证书”

我正在使用 REST Assured ,我的测试如下所示:

String cert = StreamUtils.copyToString(
  new ClassPathResource("certs/client/client_mod.crt").getInputStream(), Charset.defaultCharset());

cert = cert.replace("\r\n", "").replace("\n", "");

given()
  .spec(spec)
  .header("x-forwarded-client-cert", cert)
  .when()
  .get(HealthResource.BASE_URL + "/ip-reverse-lookup")
  .then()
  .statusCode(HttpStatus.OK.value());

此操作的基本uri为http://localhost。客户端证书“ -----BEGIN CERTIFICATE-----""-----END CERTIFICATE-----"已被删除,换行符也已删除(如上面的代码所示)。

在我的application.yml中,我有这个:

server:
  ssl:
    enabled: false
    key-store:
    key-store-password:
    trust-store:
    trust-store-password:
    client-auth: need

扩展configure的类的WebSecurityConfigurerAdapter方法如下:

http
  .x509()
  .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
  .userDetailsService(customUserDetailsService)
  .and()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
  .and()
  .csrf().disable();

任何帮助/建议将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

由于采用了容器化和网络架构,因此在实施和测试时需要考虑以下几点。

当您配置Cloud Foundry以检查客户端证书(如果存在)是否可信时,将根据受信任的CA /证书对其进行检查。这是在CF环境的常规网络组件的HAProxy上完成的。正如您正确指出的那样,它是x-forwarded-client-cert(如果包含并受信任的)放入的,该{并保证不会从外部改变。

您的应用程序在较低级别的容器中运行,并通过HAProxy / GoRouter连接到其公共主机名/ URL。当请求到达您的应用程序时,这时将不再有TLS级别的证书(准确地说是mTLS)。 SSL连接在HAProxy上终止。内部,您的应用程序/容器通过HTTP接收请求。 有关详情,请参见[1] [2]

因此您的Spring Application仅在添加到请求的标头中接收有关X.509 / mTLS证书的信息。因此,向Spring应用程序添加/配置x509支持没有意义,因为没有真正的mTLS可以到达端点。这也是您收到上面发布的日志消息的原因。而是需要让您的应用程序读取标头并根据标头执行逻辑。