【问题标题】:Where SSLSocketFactory and HttpsURLConnection work diffrerently?SSLSocketFactory 和 HttpURLConnection 在哪里工作不同?
【发布时间】:2014-06-06 01:37:24
【问题描述】:

我有一个带有自签名证书的服务器。我已经在我的计算机上使用 keytool 导入它并使用

-Djavax.net.ssl.trustStore=blabla

编译参数。当我尝试运行以下代码时:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket("MY_URL_DIGITS", 443);
OutputStream os = socket.getOutputStream();
os.write("Test request \n".getBytes());
os.flush();
os.close();

一切正常,我可以在服务器上看到“测试请求”。但是,当我运行时:

URL url = new URL("https://MY_URL_DIGITS");
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
OutputStream os = con.getOutputStream();
os.write("Test request \n".getBytes());
os.flush();
os.close();

我收到了

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

那么这两个 sn-ps 的主要区别是什么?

【问题讨论】:

    标签: java ssl ssl-certificate


    【解决方案1】:

    不同的是HTTPS增加了一个步骤,可以在HostnameVerifier界面看到。它正在尝试将要连接的主机名与SubjectDN 中的主机名或替代名称相匹配。

    【讨论】:

      【解决方案2】:

      SSLSocket 默认只检查你是否信任证书。 HttpsURLConnection 检查您是否信任证书,并检查证书是否表明它来自您实际导航到的同一个地方。为了使您的 HttpsURLConnection 成功,证书必须指定与您要连接的服务器相同的主题备用名称 (SAN)。在这种情况下,SAN 需要是“dns:MY_URL_DIGITS”,其中“dns”部分表示您指定的是主机名而不是 IP 地址。

      如果您需要有关如何使用主题备用名称创建证书的更多信息,请参阅:

      how to add subject alernative name to ssl certs?

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 1970-01-01
        • 2014-12-30
        • 2018-08-03
        • 1970-01-01
        • 2018-09-25
        • 2018-11-07
        • 1970-01-01
        相关资源
        最近更新 更多