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

时间:2017-04-24 17:43:46

标签: java ssl truststore

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

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

我确实找到了这个question already asked,但已经有好几年了,而且我不知道Java 7,8或9是否已经解决了这个问题。

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

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

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

这是否存在于Java 7 +中?

1 个答案:

答案 0 :(得分: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();
    }

}

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