将自定义SSL证书添加到信任库,但保留Java 8+中的默认cacerts?

Eri*_* B. 6 java ssl truststore

Java中是否有指定其他信任库的方法,但如果在指定的信任库中找不到匹配的证书,则java默认为cacerts?我希望能够在几个应用程序中创建一个包含一些我需要的基本证书的信任库,但无需单独更新每个jre的cacerts文件.

我意识到我可以扩展cacerts文件(即:复制并添加到它),但我宁愿拥有一个只有我的附加证书的中央信任库.

我确实发现这个问题已经问过了,但是已经有好几年了,我不知道Java 7,8或9是否已经解决了这个问题.

我发现的所有文档都指向使用javax.net.ssl.trustStore并将其指向我的新信任库,但这将忽略我的cacerts中的所有内容.

如果我指向我的密钥库javax.net.ssl.keyStore,那么我就不能拥有特定于应用程序的密钥库.

理想情况下,我希望能够为java迭代创建一个信任库列表.

Java 7+中是否存在这种情况?

Hak*_*n54 0

我在这里回答了一个类似的问题:Using a custom truststore in java as well as the default one

这是可能的,请参阅下面的Github设置示例- SSLContext-Kickstart库,该库由我维护。

import nl.altindag.sslcontext.SSLFactory;

import javax.net.ssl.SSLContext;
import java.security.cert.X509Certificate;
import java.util.List;

public class App {

    public static void main(String[] args) {
        String trustStorePathOne = ...;
        String trustStorePathTwo = ...;
        char[] password = "password".toCharArray();


        SSLFactory sslFactory = SSLFactory.builder()
                .withDefaultTrustMaterial() // uses JDK trust store
                .withTrustMaterial(trustStorePathOne, password)
                .withTrustMaterial(trustStorePathTwo, password)
                .build();

        SSLContext sslContext = sslFactory.getSslContext();
        List<X509Certificate> trustedCertificates = sslFactory.getTrustedCertificates();
    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,它的作用是从每个 TrustStore 创建一个 TrustManager,并将所有 TrustManager 包装到一个委托 TrustManager中,该委托 TrustManager 将根据所有 TrustManager 验证对方的证书