使用java代码向密钥库添加证书
我正在尝试使用服务器的.cer证书文件建立https连接。我能够使用浏览器手动获取证书文件,并使用keytool将其放入密钥库。然后,我可以使用java代码访问密钥库,获得添加到密钥库的证书,并连接到服务器 然而,我现在想要实现甚至是使用java代码获取证书文件并将其添加到密钥库的过程,而不使用keytool或浏览器获取证书 有人能告诉我怎么做以及我需要做什么吗?编辑:似乎正是你想要的 使用以下代码可以在运行时添加信任存储使用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
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完全没有意义。