弹簧靴X509测试-PCF [英] Spring boot x509 testing - pcf
问题描述
在Cloud Foundry中,我对其进行了配置,以便将客户端证书转发到我的Spring Boot应用程序。
证书被放在x-forwarded-client-cert
头中,Spring Boot应用程序读取这个?,并检查CN是否被列入白名单并发送适当的响应。不幸的是,我无法通过测试来复制这种行为。我继续收到(在调试输出中):
"在请求中未找到客户端证书"
我使用的是REST ASSERED,我的测试如下所示:
String cert = StreamUtils.copyToString(
new ClassPathResource("certs/client/client_mod.crt").getInputStream(), Charset.defaultCharset());
cert = cert.replace("
", "").replace("
", "");
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-----"
已被删除,换行符也已删除(如您在上面的代码中所见)。
在我的应用程序.yml中有:
server:
ssl:
enabled: false
key-store:
key-store-password:
trust-store:
trust-store-password:
client-auth: need
扩展WebSecurityConfigurerAdapter
的类的configure
方法如下:
http
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(customUserDetailsService)
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.csrf().disable();
如有任何帮助/建议,我们将不胜感激。
谢谢。
推荐答案
鉴于集装箱化和网络架构,您在实施和测试时需要考虑以下几点。
当您配置Cloud Foundry以检查客户端证书(如果存在)是可信任的时,将对照受信任的CA/证书对它们进行检查。这是在CF环境的一般网络组件的HAProxy上完成的。正如您正确说明的那样,它(如果包含并受信任)被放入x-forwarded-client-cert
,该x-forwarded-client-cert
被保护为不能从外部更改。
您的应用程序运行在较低级别的容器中,并通过HAProxy/GoRouter连接到其公共主机名/url。当请求到达您的应用程序时,此时不再有TLS级别的证书(准确地说是mTLS)。在HAProxy上终止SSL连接。在内部,您的应用程序/容器以HTTP形式接收请求。 有关详细信息,请参阅[1][2]
因此,您的Spring应用程序只在添加到请求的头中接收有关X.509/mTLS证书的信息。因此,向Spring应用程序添加/配置x509支持是没有意义的,因为没有真正的MTL会到达端点。这也是您收到上面发布的日志消息的原因。相反,您需要让您的应用程序读取头文件并基于它执行逻辑。
这篇关于弹簧靴X509测试-PCF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!