Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
到SSL服务器的Java SSL工厂连接(仅使用公钥和证书)_Java_Ssl_Openssl - Fatal编程技术网

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

到SSL服务器的Java SSL工厂连接(仅使用公钥和证书),java,ssl,openssl,Java,Ssl,Openssl,我正在尝试连接到SSL web服务器。我们目前有一个pkcs12文件和connect,这是我们的私钥和证书。是否可以使用带有公钥和证书的Java代码进行连接。假设我有一个文件(它是数字的,但这里是pem输出) 我们可以通过以下方式连接到服务器: import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.params.HttpMethodParam

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

我们可以通过以下方式连接到服务器:

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是否会基于我们提供的密钥库在内部创建一个私钥,从而允许我们进行连接?例如

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

证书中是否嵌入了公钥?我可以使用Java向服务器发送请求而不预先创建私钥吗?

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

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

无法从公钥创建私钥。那将使目的落空

有关更多详细信息,请查看的文档


但请注意,该类已被弃用。它建议您改用。

如果您使用的是双向SSL。您能否独立于服务器设置来设置公钥/私钥?例如,在openssl中,生成自签名证书,然后生成客户端的公钥/私钥。这就是所需要的全部吗?然后服务器可以独立设置其证书/公钥。通常,服务器证书由证书颁发机构(CA)签名。来自CA的证书需要位于客户端的信任存储中。然后客户端将信任服务器证书。类似地,客户端证书需要被服务器信任。如果相同的CA同时对两者进行签名,则服务器和客户端都可以拥有包含CA证书的相同信任密钥库。客户端证书通常在web服务器中进行检查(例如Tomcat)。此外,服务器上的应用程序可以对客户端证书进行其他检查,如验证DN等。还有一个问题,假设我按照以下步骤操作(请参见答案)。我看不到客户端(tomcat)和服务器(weblogic)证书之间的连接?在您链接到的示例中,客户端和服务器都有自签名证书。这是一个选项,但一般来说,如果这将是一个生产应用程序,则不需要这样做。为客户端(Tomcat)生成的自签名证书已添加到服务器(Weblogic)的信任密钥库中。这样,服务器将显式信任客户机。服务器的证书也被添加到信任密钥库中,并且客户端和服务器都使用相同的信任密钥库。如上所述,另一种方法是让CA对客户端证书进行签名,然后将CA证书放入服务器的信任密钥库中。
> MyfileNEW.pk12 / MyfileNEW.pem
> 
> -----BEGIN CERTIFICATE----- ...
> -----END CERTIFICATE-----
> 
> -----BEGIN PUBLIC KEY----- ...
> -----END PUBLIC KEY-----