0

这是连接到 https 站点时浏览器处理 ssl 证书的方式

  1. 当我在浏览器中键入https://myDemoSite.com时,首先我的浏览器会从 myDemoSite.com 请求证书(由于 https),然后 myDemoSite 将该证书发送到浏览器

  2. 一旦浏览器收到该证书,浏览器将检查它是否由经过验证的权威机构签名,如威瑞信

  3. 如果第二步是,那么作为第三步,它检查证书问题是否与用户在浏览器中键入的 URL 相同

现在我通过 java 程序连接 https 站点说 HttpsConnectProg1。我的问题是程序 i.e HttpsConnectProg1 将如何处理这个由 https 站点连接颁发的证书(尽管这个 https 站点颁发的证书是经过验证的,即由经过验证的机构签名)。

我刚刚尝试了一个连接到发布认证证书的 https 站点的小程序。我预计会出现一些错误,例如 sslhandshake 错误或证书错误(因为我没有在 $JAVA_HOME\jre\lib\security 文件夹中添加这个经过认证的证书),但令我惊讶的是,我没有收到任何错误。

现在重要的问题是 HttpsConnectProg1 是否检查浏览器完成的第 3 步,因为这是非常重要的一步?供您参考这里是

 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Properties;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLSession;


 public class ConnectToDemoSite {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    String urlStr = "https://www.myDemoSite.com/demo1/";
    URL url;
    Properties reply = new Properties();
    try {
        url = new URL(urlStr);
        URLConnection conn = url.openConnection();
        if(conn instanceof HttpsURLConnection)
        {
        HttpsURLConnection conn1 = (HttpsURLConnection)url.openConnection();
            conn1.setHostnameVerifier(new HostnameVerifier()  
            {        
                public boolean verify(String hostname, SSLSession session)  
                {  
                    return true;  
                }  
            });  

        reply.load(conn1.getInputStream());
        }
        else 
        {
             conn = url.openConnection();
             reply.load(conn.getInputStream());
        }
    } catch (MalformedURLException e) {
       e.printStackTrace();
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("reply is"+reply);



 }

}
4

2 回答 2

2

当您使用 Java 连接到https://URI 时,它使用Java 安全套接字扩展 (JSSE)(除非您真的想使用 SSL/TLS 的自定义实现,但这非常罕见)。

有多种方法可以调整信任管理(主要是使用自定义TrustManager),但否则它将使用一定数量的合理设置。

在您的示例中,将使用 default 验证证书,该证书SSLContext本身配置为 default X509TrustManager,并从中读取信任锚(请参阅JSSE 参考指南的自定义cacerts部分中的表格)。

默认情况下,JRE 带有许多预信任的 CA 证书(如大多数浏览器或操作系统)cacerts,通常类似于您在浏览器中找到的证书。这是 JSSE 参考。指南说:

重要说明:JDK 在 /lib/security/cacerts 文件中附带了数量有限的受信任根证书。如 keytool 中所述,如果您将此文件用作信任库,则您有责任维护(即添加/删除)此文件中包含的证书。

根据您联系的服务器的证书配置,您可能需要添加额外的根证书。从适当的供应商处获取所需的特定根证书。

如果证书是可信的,它会检查主机名是否对预期的 URL 有效。(请注意,检查的不是完整的 URL,而只是主机名。)

这些规则在RFC 2818(HTTPS 规范)第 3.1 节中定义。(Java 7 还没有实现 RFC 6125,但规则非常相似,尤其是对于 HTTPS。)编辑:当连接建立时,URLConnection(和底层SSLSession)设置为服务器的主机名。简而言之,遵循 RFC 2818 中的规则,它会在证书的主题备用名称 (SAN) 扩展中查看服务器证书以查找 DNS 条目,以查看它是否与为连接设置的主机名匹配,或者查找该名称在证书的主题 DN 的公用名 (CN) 中,当不存在 SAN DNS 条目时。

主机名验证通常由默认主机名验证程序完成。在您的示例中,您已将默认验证器替换为始终返回的验证器true。因此,在您的情况下,此验证实际上不会发生,并且所有内容都将被接受(您这样做会引入安全漏洞)。

此外,在 Java 中完成的默认主机名验证比许多浏览器更严格地遵循 RFC 2818。特别是,它不接受 CNs 中的 IP 地址

(出于与您应该使用始终返回 true 的主机名验证器相同的原因,您不应该使用不做任何事情的信任管理器,因为您会看到许多示例,它们为某些 SSL 提供了快速修复错误信息。)

于 2012-05-30T10:14:43.093 回答
1

Java includes root certificates from well-known certificate authorities, so if you have a real certificate, it operates much like a browser.

If you sign your own certificate, a browser will warn you and provide a UI to enable use of the certificate in the future. This is where things diverge for a Java program—the right way to handle this depends entirely on the program you are writing, and there can't be a one-size-fits-all approach.

If your application has a UI, you could do something similar to what a browser does.

On the other hand, a "headless" application is usually pre-configured with the necessary root certificates.

In the end, both browsers and the Java PKIX validation libraries are maintaining the security of TLS by requiring you to provide or approve the root certificates on which authentication ultimately depend. Without trusted root certificates, it is impossible to authenticate a server, and thus impossible to ensure privacy or integrity of communications.

于 2019-05-14T21:27:41.063 回答