使用java代码向密钥库添加证书

使用java代码向密钥库添加证书,java,https,ssl-certificate,keytool,digital-certificate,Java,Https,Ssl Certificate,Keytool,Digital Certificate,我正在尝试使用服务器的.cer证书文件建立https连接。我能够使用浏览器手动获取证书文件,并使用keytool将其放入密钥库。然后,我可以使用java代码访问密钥库,获得添加到密钥库的证书,并连接到服务器 然而,我现在想要实现甚至是使用java代码获取证书文件并将其添加到密钥库的过程,而不使用keytool或浏览器获取证书 有人能告诉我怎么做以及我需要做什么吗?编辑:似乎正是你想要的 使用以下代码可以在运行时添加信任存储 import java.io.InputStream; import j

我正在尝试使用服务器的.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);
    }
}
我使用此代码与active directory服务器建立了安全的LDAP连接

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

我编写了一个小型库来实现这一点

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);
    }
}
您可以通过从资产目录提供文件名来加载任何证书

用法:

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


谢谢你的回复,桑德罗。我还有一个问题。我们如何获得特定url的证书?我在谷歌上找到了“java下载网站证书”。它似乎正是你想要的。谢谢你的链接桑德罗。。。这真的很有帮助。@Sandro-link是410GONE@NickGrealy看这里:这有什么作用?我无法想象您为什么要这样做。我正在尝试验证内部服务器中的表单内容,然后再将客户端请求发回hp服务器。我相信这将防止任何基于浏览器的支付篡改,我的服务器可以执行所有预期的检查,而不是让hp的网站执行。但是,为了做到这一点,我需要使用java代码获取服务器的证书来执行握手。我不想每次都手动下载证书并将其放入密钥库。我希望代码自动完成这一部分..您不应该在密钥存储中需要服务器证书。如果服务器配置正确,您所需要的只是服务器证书链的“根”。不幸的是,由于我连接到外部服务器,我无法控制它们的配置。您应该意识到,这样做会丧失对服务器进行身份验证的能力。您不知道是将付款信息发送给HP还是发送给骗子。任何合法的支付处理器都将正确配置其服务,以便您能够对其进行身份验证。否则,使用TLS完全没有意义。