PCF Container TrustManager添加证书,但是TrustManagerFactory加载了两次证书
PCF Container TrustManager adds certificates, but TrustManagerFactory loads certificates twice
我 运行 使用 apache-httpclient 4.x 在 PCF 上启动 spring 应用程序。客户端创建 ssl 上下文:
final SSLContext sslcontext = SSLContext.getInstance(algorithm);
sslcontext.init(keymanagers, trustmanagers, params.getSecureRandom());
我得到的 trustmanagers 如下:
final TrustManagerFactory tmfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmfactory.init((KeyStore) null);
我记录了它找到的证书数量,并记录了找到的 CN。但是我发现它列出了每个证书两次!
如果我提供带有 1 个证书的密钥库:
tmfactory.init((KeyStore) truststore);
它将记录该证书 + 所有环境证书。如下:
private static void logAcceptedIssuers(TrustManager[] trustmanagers) {
log.info("Adding the following trusted certificates to the SSL context: ");
Arrays.stream(trustmanagers)
.filter(X509TrustManagerWrapper.class::isInstance)
.map(X509TrustManagerWrapper.class::cast)
.map(X509TrustManagerWrapper::getAcceptedIssuers)
.forEach(SSLContextFactory::logAcceptedIssuers);
}
private static void logAcceptedIssuers(final X509Certificate[] certificates) {
final int certificatesCount = certificates.length;
final String prefix = "Trusted certificates (total=" + certificatesCount + "): \n";
final String certDNs = Arrays.stream(certificates)
.map(X509Certificate::getSubjectDN)
.map(Principal::getName)
.map(SSLContextFactory::extractCommonName)
.collect(Collectors.joining(" |#| ", prefix, "\n"));
log.info(certDNs);
}
@VisibleForTesting
static String extractCommonName(String principalName) {
... Some code for extracting commonname from principal name...
return cn;
}
TrustManagerFactory 在哪里找到 pcf 可信证书?
我如何检查这些 pcf 证书是否可用并加载,或者我在哪里可以获得 pcf-certificates-only TrustManager。我担心的是,如果我加载两次它可能会导致问题,但我没有迹象表明它会导致问题(但现在我的 SSLContext 中有 288 个证书而不是 144 个证书,这会影响性能吗?它会导致问题吗?)。
此致,
瑞克
Java buildpack 添加了一个名为 Container Security Provider 的组件。这就是添加自动加载 Platform/Bosh 可信 CA 证书以及容器实例 ID 证书和密钥的功能。
为确保 platform/Bosh 个受信任的 CA 证书是受信任的,容器安全提供程序添加了 a TrustManagerFactory。这会查看文件 /etc/ssl/certs/ca-certificates.crt
并信任该文件中的所有内容。
这是对 JVM 默认行为的补充。
I log the number of certificates it finds and I log the found CN's. However I found it list every certificate twice!
您没有分享代码来展示您是如何做到这一点的,所以我只能推测。我怀疑您看到了重复项,因为容器安全提供程序没有替换 JVM 中信任 CA 证书的默认行为,它添加了一个额外的 TrustManager。
将其与 /etc/ssl/certs/ca-certificates.crt
中的内容与 JVM 的默认信任库中的内容之间可能存在很多重叠的事实相结合。我想我可以看到有重复项。
If I provide a keystore with 1 certificate:
It will log that certificate + all environment certificates.
这进一步是我的怀疑,因为当您覆盖默认的 JVM 信任库时,听起来重复项消失了。这意味着您只剩下自定义信任库以及 CSP 添加的内容。
Where does the TrustManagerFactory find the pcf trusted certificates.
How can I check if those pcf certificates are available & loaded, or where can I get the pcf-certificates-only TrustManager. I want this to prevent loading the certificates twice.
这里有更大的问题吗?我明白你所说的看到两次列出证书,但这是否真的导致你的应用程序出现问题?如果是这样,请更新您的问题并解释发生了什么?这可能有助于提供更多背景信息。
除此之外:
您可以禁用 CSP。设置和环境变量 JBP_CONFIG_CONTAINER_SECURITY_PROVIDER='{trust_manager_enabled: false}'
.
请注意,通过禁用此功能,您的应用程序将不会自动信任 platform/Bosh 已部署的 CA 证书。这可能会导致失败。例如,如果您的应用程序绑定到 CF 市场服务,该服务使用由通过 platform/Bosh 可信 CA 证书分发的 CA 签名的证书。
您可以反其道而行之,将默认的 Java 信任库设置为指向一个空的密钥库。您需要创建一个空的密钥库,可能在您的应用程序下,然后设置 -Djavax.net.ssl.keyStore=/home/vcap/app/empty.jks
(/home/vcap/app
是您应用程序的根目录,将其余部分更改为指向您存储空密钥库文件的位置)。
如果我的怀疑属实,那么其中任何一个都会导致重复项消失。
我 运行 使用 apache-httpclient 4.x 在 PCF 上启动 spring 应用程序。客户端创建 ssl 上下文:
final SSLContext sslcontext = SSLContext.getInstance(algorithm);
sslcontext.init(keymanagers, trustmanagers, params.getSecureRandom());
我得到的 trustmanagers 如下:
final TrustManagerFactory tmfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmfactory.init((KeyStore) null);
我记录了它找到的证书数量,并记录了找到的 CN。但是我发现它列出了每个证书两次!
如果我提供带有 1 个证书的密钥库:
tmfactory.init((KeyStore) truststore);
它将记录该证书 + 所有环境证书。如下:
private static void logAcceptedIssuers(TrustManager[] trustmanagers) {
log.info("Adding the following trusted certificates to the SSL context: ");
Arrays.stream(trustmanagers)
.filter(X509TrustManagerWrapper.class::isInstance)
.map(X509TrustManagerWrapper.class::cast)
.map(X509TrustManagerWrapper::getAcceptedIssuers)
.forEach(SSLContextFactory::logAcceptedIssuers);
}
private static void logAcceptedIssuers(final X509Certificate[] certificates) {
final int certificatesCount = certificates.length;
final String prefix = "Trusted certificates (total=" + certificatesCount + "): \n";
final String certDNs = Arrays.stream(certificates)
.map(X509Certificate::getSubjectDN)
.map(Principal::getName)
.map(SSLContextFactory::extractCommonName)
.collect(Collectors.joining(" |#| ", prefix, "\n"));
log.info(certDNs);
}
@VisibleForTesting
static String extractCommonName(String principalName) {
... Some code for extracting commonname from principal name...
return cn;
}
TrustManagerFactory 在哪里找到 pcf 可信证书?
我如何检查这些 pcf 证书是否可用并加载,或者我在哪里可以获得 pcf-certificates-only TrustManager。我担心的是,如果我加载两次它可能会导致问题,但我没有迹象表明它会导致问题(但现在我的 SSLContext 中有 288 个证书而不是 144 个证书,这会影响性能吗?它会导致问题吗?)。
此致,
瑞克
Java buildpack 添加了一个名为 Container Security Provider 的组件。这就是添加自动加载 Platform/Bosh 可信 CA 证书以及容器实例 ID 证书和密钥的功能。
为确保 platform/Bosh 个受信任的 CA 证书是受信任的,容器安全提供程序添加了 a TrustManagerFactory。这会查看文件 /etc/ssl/certs/ca-certificates.crt
并信任该文件中的所有内容。
这是对 JVM 默认行为的补充。
I log the number of certificates it finds and I log the found CN's. However I found it list every certificate twice!
您没有分享代码来展示您是如何做到这一点的,所以我只能推测。我怀疑您看到了重复项,因为容器安全提供程序没有替换 JVM 中信任 CA 证书的默认行为,它添加了一个额外的 TrustManager。
将其与 /etc/ssl/certs/ca-certificates.crt
中的内容与 JVM 的默认信任库中的内容之间可能存在很多重叠的事实相结合。我想我可以看到有重复项。
If I provide a keystore with 1 certificate: It will log that certificate + all environment certificates.
这进一步是我的怀疑,因为当您覆盖默认的 JVM 信任库时,听起来重复项消失了。这意味着您只剩下自定义信任库以及 CSP 添加的内容。
Where does the TrustManagerFactory find the pcf trusted certificates.
How can I check if those pcf certificates are available & loaded, or where can I get the pcf-certificates-only TrustManager. I want this to prevent loading the certificates twice.
这里有更大的问题吗?我明白你所说的看到两次列出证书,但这是否真的导致你的应用程序出现问题?如果是这样,请更新您的问题并解释发生了什么?这可能有助于提供更多背景信息。
除此之外:
您可以禁用 CSP。设置和环境变量
JBP_CONFIG_CONTAINER_SECURITY_PROVIDER='{trust_manager_enabled: false}'
.请注意,通过禁用此功能,您的应用程序将不会自动信任 platform/Bosh 已部署的 CA 证书。这可能会导致失败。例如,如果您的应用程序绑定到 CF 市场服务,该服务使用由通过 platform/Bosh 可信 CA 证书分发的 CA 签名的证书。
您可以反其道而行之,将默认的 Java 信任库设置为指向一个空的密钥库。您需要创建一个空的密钥库,可能在您的应用程序下,然后设置
-Djavax.net.ssl.keyStore=/home/vcap/app/empty.jks
(/home/vcap/app
是您应用程序的根目录,将其余部分更改为指向您存储空密钥库文件的位置)。
如果我的怀疑属实,那么其中任何一个都会导致重复项消失。