需要在运行时从 txt 文件添加证书

Need to add certificate from txt file in runtime

客户提供了 2 个“.txt”格式的证书,我需要在运行时调用 SOAP 服务时添加这些证书。无法添加“.txt”格式文件,因为我越来越像 'Invalid Format'。证书在 txt 文件的顶部和底部有“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”headers,因此它是 PEM 类型文件(我假设)。任何 help/suggestion 都将是可观的。

低于异常::

Exception in thread "main" java.io.IOException: Invalid keystore format

使用下面的代码..

public KeyManagerFactory getKeyManagerFactory() throws UnrecoverableKeyException, CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException {
    InputStream inputStream = null;
    KeyStore ts = null;
    KeyManagerFactory keyManagerFactory = null;
    try {
        ts = KeyStore.getInstance("JKS");
        inputStream = this.getClass().getClassLoader().getResourceAsStream("publicCert.txt");
        ts.load(inputStream, null);
        keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(ts, null);
    } catch (Exception e) {
        throw e;
    } finally {
        try {
            inputStream.close();
        } catch (Exception e) {
            throw e;
        }
    }
    return keyManagerFactory;
}

得到答案后,使用下面的代码,它的工作

        rootInterIS = new FileInputStream("rootIntermediaryCertificate.txt");
        domainIS = new FileInputStream("domainCertificate.txt");

        keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(null);

        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        X509Certificate rootInterCert = (X509Certificate) certFactory.generateCertificate(rootInterIS);
        X509Certificate domainCert = (X509Certificate) certFactory.generateCertificate(domainIS);
        keystore.setCertificateEntry("domainCertificate", domainCert);
        keystore.setCertificateEntry("rootInterCe", rootInterrtificateCert);

        trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keystore);

PEM 格式由一行 ----BEGIN x----- 表示一个或多个单词 x,一行或多行包含内部结构匹配 x 的数据的 base64,以及匹配的 END 行。虽然有人 可以 创建一个包含正确 BEGIN/END 行但错误的 base64 的伪造文件,除非他们主动试图给你带来麻烦,一个看起来像你描述的文件很可能是PEM 证书。

证书(PEM 格式)不是密钥库,尤其不是 JKS。 Java 支持多种不同的密钥库格式,其中 none 是 PEM,none 仅限于证书。使用 KeyStore.getInstance(type) 仅读取您没有的密钥库;使用 CertificateFactory.getInstance("X.509") 读取证书文件(实际上是 PEM 或二进制文件,也就是 DER,但目前您只关心前者)。

在 SSL/TLS 中,KeyManager 仅用于使用私钥 验证(证明)您自己身份的证书 没有。将没有私钥的证书放在 KeyManager 中将完全无用且无效。如果有人只给了你一个证书而不是私钥来连接到他们的系统,那应该是一个证书来验证他们的系统,而不是你的;询问供应商或查看文件以确认这一点。鉴于 Java,您可以使用 keytool -printcert -file $file 查看证书的详细信息。

您需要将该证书放入 TrustManager 中。请注意 KeyManagerTrustManager 都使用 KeyStore 对象,但出于不同的目的以不同的方式使用。因此,您创建了一个 in-memory 空 KeyStore (执行 .getInstance(type) 然后 .load(null)), 添加 上面的证书 作为 'trusted' 证书,并将其传递给 TrustManagerFactory,然后在 SSLContext

中使用生成的 TrustManager ]