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.

https://github.com/cloudfoundry/java-buildpack-security-provider/blob/main/src/main/java/org/cloudfoundry/security/CloudFoundryContainerTrustManagerFactory.java#L41

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.

这里有更大的问题吗?我明白你所说的看到两次列出证书,但这是否真的导致你的应用程序出现问题?如果是这样,请更新您的问题并解释发生了什么?这可能有助于提供更多背景信息。

除此之外:

  1. 您可以禁用 CSP。设置和环境变量 JBP_CONFIG_CONTAINER_SECURITY_PROVIDER='{trust_manager_enabled: false}'.

    https://github.com/cloudfoundry/java-buildpack/blob/main/docs/framework-container_security_provider.md#security-provider

    请注意,通过禁用此功能,您的应用程序将不会自动信任 platform/Bosh 已部署的 CA 证书。这可能会导致失败。例如,如果您的应用程序绑定到 CF 市场服务,该服务使用由通过 platform/Bosh 可信 CA 证书分发的 CA 签名的证书。

  2. 您可以反其道而行之,将默认的 Java 信任库设置为指向一个空的密钥库。您需要创建一个空的密钥库,可能在您的应用程序下,然后设置 -Djavax.net.ssl.keyStore=/home/vcap/app/empty.jks/home/vcap/app 是您应用程序的根目录,将其余部分更改为指向您存储空密钥库文件的位置)。

如果我的怀疑属实,那么其中任何一个都会导致重复项消失。