【发布时间】:2022-01-13 16:49:36
【问题描述】:
我使用 apache-httpclient 4.x 在 PCF 上运行 Spring Boot 应用程序。客户端创建一个 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 证书的 TrustManager。我担心如果我加载两次它可能会导致问题,但我没有迹象表明它会导致问题(但现在我的 SSLContext 中有 288 个而不是 144 个证书,这会影响性能吗?它会导致问题吗?))。
问候,
瑞克
【问题讨论】:
标签: spring-boot cloud-foundry apache-httpclient-4.x