gpt4 book ai didi

java - 浏览器和 jvm 处理 ssl 证书的区别?

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:37 24 4
gpt4 key购买 nike

这是浏览器在连接到 https 站点时如何处理 ssl 证书

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

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

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

现在我通过 java 程序连接 https 站点说 HttpsConnectProg1。我的问题是 programmei.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);



}

}

最佳答案

当您使用 Java 连接到 https:// URI 时,它使用 Java Secure Socket Extension (JSSE) (除非您真的想使用 SSL/TLS 的自定义实现,但这种情况很少见)。

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

在您的示例中,证书将使用默认的 SSLContext 进行验证,证书本身配置有默认的 X509TrustManager,并从 cacerts 中读取信任 anchor >(请参阅 Customization section of the JSSE Ref. Guide 中的表格)。

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

IMPORTANT NOTE: The JDK ships with a limited number of trusted rootcertificates in the /lib/security/cacerts file. Asdocumented in keytool, it is your responsibility to maintain (that is,add/remove) the certificates contained in this file if you use thisfile as a truststore.

Depending on the certificate configuration of the servers you contact,you may need to add additional root certificate(s). Obtain the neededspecific root certificate(s) from the appropriate vendor.

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

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

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

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

(出于与您应该使用始终返回 true 的主机名 validator 相同的原因,您不应该使用什么都不做的信任管理器,因为您会看到许多示例,提供快速修复对于一些 SSL 错误消息。)

关于java - 浏览器和 jvm 处理 ssl 证书的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10813959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com