JAVA:如何使用公共证书和私钥进行SSL连接

时间:2014-04-08 23:37:38

标签: java ssl

我希望能否就今天遇到的问题得到一些帮助:

我正在尝试使用我们客户的服务器验证我的客户端,我可以通过发出以下命令来执行此操作:

curl -v -k -H“Content-Type:application / json”--key privkey.pem --cert pub.cer --data @ search.json https:// .... < /强>

从上面的命令可以看出,我有以下内容:

  1. 公共证书
  2. 私钥
  3. 密钥库

    现在,我正在尝试在java中做同样的事情,但我不知道如何完成它。我读过的所有指南告诉我,我应该使用我拥有的密钥库。但是在遵循这些指南时我遇到了障碍。

    我可以帮助或指出某个方向,我会非常感激。

    提前致谢, 彼得

2 个答案:

答案 0 :(得分:2)

听起来您需要使用HTTPS URL连接来连接需要客户端身份验证的服务器。你需要做两件事才能从那里到达那里。

首先,您需要从私钥和公共证书创建Java样式密钥库。详细说明可以在这个问题的答案中找到:

importing an existing x509 certificate and private key in Java keystore to use in ssl

您还需要将服务器的证书导入密钥库。

其次,您需要编写Java代码才能使用新创建的密钥库。通过使用密钥库创建SSLContext,并将HTTPS URL连接设置为使用此上下文中的套接字工厂来实现此目的 - 具体如下:

SSLContext sslContext 
    = SSLConnections.getSSLContext(keyStoreFile, keyStoreFilePassword);
httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());

这应该在创建HttpsURLConnection之后但在连接之前完成 - 也就是说,在你读取或写入它之前,或者在它上面调用connect()之前。

答案 1 :(得分:1)

这是我用来连接的代码。一旦执行代码con.coonect(),代码就会抛出异常。对于堆栈跟踪。

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File("C:\\keystore"));
trustStore.load(instream, "x".toCharArray());
instream.close(); 
URL url = new URL(httpsURL); 
con = (HttpsURLConnection) url.openConnection(); 
SSLContext sslContext 
    = SSLContexts
        .custom() 
        .useProtocol("TLSv1")  
        .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy())
        .build();
con.setSSLSocketFactory(sslContext.getSocketFactory()); 
con.connect();`

可以通过访问以下链接找到堆栈跟踪:

http://50.19.106.70/stacktrack.txt