【问题标题】:Java SSL factory connection to SSL server (with just public-key and certificate)Java SSL 工厂与 SSL 服务器的连接(仅使用公钥和证书)
【发布时间】:2013-12-27 05:40:42
【问题描述】:

我正在尝试连接到 SSL 网络服务器。我们目前有一个 pkcs12 文件并连接,这是我们的私钥和证书。是否可以使用带有公钥和证书的 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 不会在内部根据我们提供的密钥库创建一个私钥并允许我们连接吗?例如

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

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

【问题讨论】:

    标签: java ssl openssl


    【解决方案1】:

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

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

    您不能从公钥创建私钥。那会破坏目的。

    查看SSLSocketFactory的文档了解更多详情。

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

    【讨论】:

    • 如果您使用的是 2-way SSL。您可以设置独立于服务器设置的公钥/私钥吗?例如。在 openssl 中,您生成一个自签名证书,然后是客户端的公钥/私钥。这就是所有需要的吗?然后服务器可以独立设置他们的证书/公钥。
    • 通常,服务器证书由证书颁发机构 (CA) 签署。来自 CA 的证书需要在客户端的信任库中。然后客户端将信任服务器证书。同样,客户端证书需要被服务器信任。如果同一个 CA 签署两者,则服务器和客户端都可以拥有包含 CA 证书的相同信任密钥库。客户端证书通常在 Web 服务器(例如 Tomcat)中检查。此外,服务器上的应用程序可以对客户端证书进行其他检查,例如验证 DN 等。
    • 还有一个问题,假设我按照以下步骤操作(请参阅答案)。我没有看到客户端(tomcat)和服务器(weblogic)证书之间的连接? stackoverflow.com/questions/16290992/…
    • 在您链接到的示例中,客户端和服务器都有自签名证书。这是一个选项,但如果这将是一个生产应用程序,通常不会这样做。为客户端 (Tomcat) 生成的自签名证书已添加到服务器 (Weblogic) 的信任密钥库中。这样,服务器将明确信任客户端。服务器的证书也被添加到信任密钥库中,并且客户端和服务器都使用相同的信任密钥库。正如我上面提到的,另一种方法是让 CA 签署客户端证书,然后将 CA 证书放在服务器的信任密钥库中。
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 2016-07-12
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2020-08-04
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多