使用 Java 代码将证书添加到密钥库

我正在尝试使用服务器的.cer证书文件建立https连接。我能够使用浏览器手动获取证书文件,并使用keytool将其放入密钥库。然后,我可以使用java代码访问密钥库,获取我添加到密钥库的证书并连接到服务器。

但是,我现在甚至希望实现使用java代码获取证书文件并将其添加到我的密钥库的过程,而无需使用keytool或浏览器来获取证书。

有人可以告诉我如何处理这个问题以及我需要做什么吗?


答案 1

编辑:这似乎完全符合您的要求。

使用以下代码,可以在运行时添加信任存储区。

import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class SSLClasspathTrustStoreLoader {
    public static void setTrustStore(String trustStore, String password) throws Exception {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore);
        keystore.load(keystoreStream, password.toCharArray());
        trustManagerFactory.init(keystore);
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustManagers, null);
        SSLContext.setDefault(sc);
    }
}

我使用此代码与活动目录服务器建立安全的 LDAP 连接。

也可能是有用的,在底部有一个类,它能够在运行时导入证书。


答案 2

我写了小型库ssl-utils-android来做到这一点。

您可以通过从资产目录中提供文件名来加载任何证书。

用法:

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());