【发布时间】:2015-06-20 10:53:00
【问题描述】:
我正在创建一个 Java 程序以从服务器获取信息,但我必须从 Java 程序与服务器执行 ssl 握手。
我有 myfilercert.cer 用于身份验证的文件证书,但我不知道如何在 java 中加载该证书,以便 java 程序可以与我想从中获取信息的服务器执行“握手”。从哪里开始?
【问题讨论】:
我正在创建一个 Java 程序以从服务器获取信息,但我必须从 Java 程序与服务器执行 ssl 握手。
我有 myfilercert.cer 用于身份验证的文件证书,但我不知道如何在 java 中加载该证书,以便 java 程序可以与我想从中获取信息的服务器执行“握手”。从哪里开始?
【问题讨论】:
您需要的是 java keystore。密钥库是 SSL 加密中使用的安全证书的存储库。 您可以阅读here 关于 SSL 握手期间的服务器身份验证。 This is a keystore tutorial.
作为 keytool 的替代品,我建议使用一个名为 Portecle 的带有图形用户界面的工具。您可以使用它来浏览 .cer 文件的内容并查看其中的内容。
了解various certificate encodings 会很有用。另请阅读X.509 standard。
This is an article 关于 java keytool essentials(这是与 java 密钥库一起使用的 oracle 工具)。
您可以 google 并找到很多指导您如何生成的资源。我认为您会希望将证书保留在应用程序级别。
在此过程中帮助我的一些 SO 问题:
祝你好运!
【讨论】:
你可以使用 Apache HttpClient(或者只是使用它所需的类来使用SslContextBuilder,真的),然后它会是这样的:
SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.loadTrustMaterial(new File("yourTrustStore.jks"), "thePassWord");
SSLContext sslContext = sslContextBuilder.build();
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) (new URL("https://thesite.com").openConnection());
httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());
但是您需要为您的证书创建一个密钥库,这可以使用 keytool 完成。如果你需要这个 android,你需要 SpongyCastle 库,并使用它作为 KeyTool 的提供者来创建 BKS 密钥库而不是 JKS 密钥库;您需要在 Java 中显式打开 KeyStore。
KeyStore keyStore = KeyStore.getInstance("BKS",
BouncyCastleProvider.PROVIDER_NAME);
byteArrayInputStream = new ByteArrayInputStream(keyStoreBytes);
keyStore.load(byteArrayInputStream, keyStorePassword);
Certificate[] certificates = keyStore.getCertificateChain("theCertAlias");
Certificate certificate = certificates[0];
【讨论】: