使用 Java 代码将证书添加到密钥库
2022-09-02 10:41:03
我正在尝试使用服务器的.cer证书文件建立https连接。我能够使用浏览器手动获取证书文件,并使用keytool将其放入密钥库。然后,我可以使用java代码访问密钥库,获取我添加到密钥库的证书并连接到服务器。
但是,我现在甚至希望实现使用java代码获取证书文件并将其添加到我的密钥库的过程,而无需使用keytool或浏览器来获取证书。
有人可以告诉我如何处理这个问题以及我需要做什么吗?
我正在尝试使用服务器的.cer证书文件建立https连接。我能够使用浏览器手动获取证书文件,并使用keytool将其放入密钥库。然后,我可以使用java代码访问密钥库,获取我添加到密钥库的证书并连接到服务器。
但是,我现在甚至希望实现使用java代码获取证书文件并将其添加到我的密钥库的过程,而无需使用keytool或浏览器来获取证书。
有人可以告诉我如何处理这个问题以及我需要做什么吗?
编辑:这似乎完全符合您的要求。
使用以下代码,可以在运行时添加信任存储区。
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 连接。
这也可能是有用的,在底部有一个类,它能够在运行时导入证书。
我写了小型库ssl-utils-android来做到这一点。
您可以通过从资产目录中提供文件名来加载任何证书。
用法:
OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());