Spring 启动 x509 测试 - pcf
Spring boot x509 testing - pcf
在 Cloud Foundry 中,我对其进行了配置,以便将客户端证书转发到我的 spring 启动应用程序。
证书放在 x-forwarded-client-cert
header 中,spring 引导应用程序读取这个?,并检查 CN 是否列入白名单并发送适当的响应。不幸的是,我无法通过测试复制这种行为。我不断得到(在调试输出中):
"no client certificate found in request"
我正在使用 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
扩展 WebSecurityConfigurerAdapter
的 class 的 configure
方法如下所示:
http
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(customUserDetailsService)
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.csrf().disable();
任何 help/suggestions 将不胜感激。
谢谢。
由于容器化和网络架构,您需要在实施和测试时考虑以下几点。
当您将 Cloud Foundry 配置为检查客户端证书(如果存在)是否可信时,将根据可信的 CA/证书检查它们。这是在 CF 环境的通用网络组件的 HAProxy 上完成的。正如您正确陈述的那样,它(如果包含并受信任)被放入 x-forwarded-client-cert
中,该 x-forwarded-client-cert
是安全的,不会从外部改变。
您的应用程序在较低级别的容器中运行,并通过 HAProxy / GoRouter 连接到其 public 主机名/url。当请求到达您的应用程序时,此时不再有 TLS 级别的证书(准确地说是 mTLS)。 SSL 连接在 HAProxy 上终止。在内部,您的应用程序/容器以 HTTP 形式接收请求。
详情见[1] [2]
因此,您的 Spring 应用程序刚刚收到添加到请求中的 header 中有关 X.509 / mTLS 证书的信息。因此,向 Spring 应用程序添加/配置 x509 支持没有意义,因为真正的 mTLS 永远不会到达端点。这也是您收到上面发布的日志消息的原因。相反,您需要让您的应用程序读出 header 并根据它执行您的逻辑。
在 Cloud Foundry 中,我对其进行了配置,以便将客户端证书转发到我的 spring 启动应用程序。
证书放在 x-forwarded-client-cert
header 中,spring 引导应用程序读取这个?,并检查 CN 是否列入白名单并发送适当的响应。不幸的是,我无法通过测试复制这种行为。我不断得到(在调试输出中):
"no client certificate found in request"
我正在使用 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
扩展 WebSecurityConfigurerAdapter
的 class 的 configure
方法如下所示:
http
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(customUserDetailsService)
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.csrf().disable();
任何 help/suggestions 将不胜感激。
谢谢。
由于容器化和网络架构,您需要在实施和测试时考虑以下几点。
当您将 Cloud Foundry 配置为检查客户端证书(如果存在)是否可信时,将根据可信的 CA/证书检查它们。这是在 CF 环境的通用网络组件的 HAProxy 上完成的。正如您正确陈述的那样,它(如果包含并受信任)被放入 x-forwarded-client-cert
中,该 x-forwarded-client-cert
是安全的,不会从外部改变。
您的应用程序在较低级别的容器中运行,并通过 HAProxy / GoRouter 连接到其 public 主机名/url。当请求到达您的应用程序时,此时不再有 TLS 级别的证书(准确地说是 mTLS)。 SSL 连接在 HAProxy 上终止。在内部,您的应用程序/容器以 HTTP 形式接收请求。 详情见[1] [2]
因此,您的 Spring 应用程序刚刚收到添加到请求中的 header 中有关 X.509 / mTLS 证书的信息。因此,向 Spring 应用程序添加/配置 x509 支持没有意义,因为真正的 mTLS 永远不会到达端点。这也是您收到上面发布的日志消息的原因。相反,您需要让您的应用程序读出 header 并根据它执行您的逻辑。