与SSL服务器的Java SSL工厂连接(仅使用公钥和证书)

时间:2013-12-09 22:18:10

标签: java ssl openssl

我正在尝试连接到SSL Web服务器。我们目前有一个pkcs12文件和connect,这是我们的私钥和证书。是否可以使用Java代码与公钥和证书进行连接。想象一下,我有一个文件(它是数字的,但这里是pem输出)。

> Myfile.pk12 / Myfile.pem
> 
> -----BEGIN CERTIFICATE----- ...
> -----END CERTIFICATE-----
> 
> -----BEGIN ENCRYPTED PRIVATE KEY----- ...
> -----END ENCRYPTED PRIVATE KEY-----

我们可以用这个连​​接到服务器:

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;


        KeyStore keyStore = generateKeyStore();
            System.out.println("==>" + keyStore);           
            SSLSocketFactory socketFactory = new SSLSocketFactory( 
                                            SSLSocketFactory.TLS,
                                            keyStore,
                                            KEYSTORE_PASSCODE,
                                            null,
                                            null,
                                            (X509HostnameVerifier) SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

...

这有效,但我们说我们连接证书和公钥。 Java内部是否会根据我们提供的密钥库创建私钥,这将允许我们连接? E.g。

> MyfileNEW.pk12 / MyfileNEW.pem
> 
> -----BEGIN CERTIFICATE----- ...
> -----END CERTIFICATE-----
> 
> -----BEGIN PUBLIC KEY----- ...
> -----END PUBLIC KEY-----

如果公钥嵌入证书中?我可以使用Java在不预先创建私钥的情况下向服务器发送请求吗?

1 个答案:

答案 0 :(得分:1)

如果服务器需要双向(相互)SSL连接(客户端必须由服务器进行身份验证,并且客户端必须信任服务器),则需要提供2个密钥库。一个包含私钥和公共证书,另一个包含可信证书颁发机构(CA)列表。

如果服务器允许单向SSL(客户端必须信任服务器),那么您只需要提供一个包含可信CA列表的密钥库。

您无法从公钥创建私钥。那会破坏目的。

查看SSLSocketFactory的文档以获取更多详细信息。

但请注意,此类已弃用。它建议您改为使用SSLConnectionSocketFactory