spring-boot - Spring Boot x509 测试 - pcf

标签 spring-boot spring-security cloud-foundry mutual-authentication

云类型转换 我对其进行了配置,以便将客户端证书转发到我的 Spring Boot 应用程序。

证书放在 x-forwarded-client-cert头,spring boot 应用程序读取这个?,并检查 CN 是否被列入白名单并发送适当的响应。不幸的是,我无法通过测试复制这种行为。我不断得到(在调试输出中):

"no client certificate found in request"



我正在使用 REST 保证 我的测试如下所示:
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();

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

谢谢。

最佳答案

由于容器化和网络架构,您需要在实现和测试时考虑以下几点。
当您将 Cloud Foundry 配置为检查客户端证书(如果存在)是否可信时,将根据受信任的 CA/证书进行检查。这是在 CF 环境的通用网络组件的 HAProxy 上完成的。正如您正确说明的那样,它(如果包含并受信任)被放入 x-forwarded-client-cert这是从外部保证不可变的。
您的应用程序在较低级别的容器中运行,并通过 HAProxy/GoRouter 连接到其公共(public)主机名/url。当请求到达您的应用程序时,此时不再有 TLS 级别的证书(准确地说是 mTLS)。 SSL 连接在 HAProxy 上终止。在内部,您的应用程序/容器以 HTTP 的形式接收请求。
查看更多详情 [1] [2]
因此,您的 Spring 应用程序只是在添加到请求的 header 中接收有关 X.509/mTLS 证书的信息。因此,向 Spring 应用程序添加/配置 x509 支持是没有意义的,因为没有真正的 mTLS 会到达端点。这也是您收到上面发布的日志消息的原因。相反,您需要让您的应用程序读出标题并根据它执行您的逻辑。

关于spring-boot - Spring Boot x509 测试 - pcf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53315857/

相关文章:

node.js - Cloud Foundry 和 Let's Encrypt

java - 如何使用 Spring Boot 通过 cron 表达式调度多个任务?

spring - Spring Boot 中用于应用程序身份验证和管理身份验证的不同凭据?

java - Spring4中从Service访问Repository时出现NullPointerException

java - Spring MVC 获取当前登录用户

java - Spring Security - 在 Controller 中获取登录用户 - 礼貌

java - 使用剩余端点扩展或缩小 PCF 应用程序

java - 在 CloudFoundry 记录器日志中保留原始控制台颜色

java - Spring-Boot:有没有办法通过aop添加Cookies

spring-boot - 分布式环境中的Spring boot application.properties?