区别与SSL证书关于浏览器和JVM的处理?(Difference in dealing with s

2019-07-29 15:38发布

这是连接到HTTPS站点时,浏览器与SSL证书如何应对

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

  2. 一旦浏览器接收该证书,浏览器会检查它是否被验证权威机构签署或不喜欢威瑞信

  3. 如果是从第二个步骤,那么作为第三步是检查是否证书问题有哪些用户在浏览器中输入相同的URL

现在我通过连接Java程序的HTTPS站点说HttpsConnectProg1.My问题是programmei.e HttpsConnectProg1将如何处理与HTTPS站点连接颁发此证书(尽管此HTTPS站点颁发的证书是由权威机构验证,即cerified签署)。

我只是想一个小程序连接到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);



 }

}

Answer 1:

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

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

在你的榜样,该证书将使用默认的验证SSLContext ,本身配置了默认X509TrustManager ,从读信任锚cacerts (见表格的JSSE参考文献指南的自定义部分 )。

默认情况下,JRE自带了一些预先的可信CA证书(最喜欢的浏览器或操作系统)在cacerts ,它通常是类似于您会在浏览器中找到。 这里是什么JSSE参考。 指南说一下:

重要说明:JDK附带在/ lib /安全/ cacerts文件受信任的根证书的数量有限。 作为密钥工具记录,它是你的责任,以保持(即,添加/删除)包含在此文件中的证书,如果您使用此文件作为一个信任。

根据您联系的服务器的证书配置,您可能需要添加额外的根证书(或多个)。 获得来自相应的供应商所需要的特定的根证书(一个或多个)。

如果证书是可信的,它会检查主机名是否是有效的目的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比更严格一些浏览器。 特别是,它不会接受在中枢神经系统的IP地址 。

(出于同样的原因,你应该使用主机名验证总是返回true,你不应该使用的信任管理器没有做任何事情,因为你会看到周围的一些例子,提供快速修复一些SSL错误消息。)



Answer 2:

Java的包括来自知名的证书颁发机构的根证书,所以如果你有一个真正的证书,它的运作就像一个浏览器。

如果您注册了自己的证书,浏览器会发出警告,并提供了一个用户界面,使应用在未来的证书。 这就是事情岔开了一个Java程序的权利来处理这完全取决于你在编写程序的方式,而不能有一个尺寸适合所有人的方法。

如果您的应用程序有一个UI,你可以做类似于一个浏览器做一些事情。

在另一方面,“无头”的应用程序通常被预先配置有必要的根证书。

最终,这两种浏览器和Java PKIX验证库会要求您提供或批准在其认证最终依赖的根证书维持TLS安全。 没有受信任的根证书,这是不可能验证服务器,从而无法确保通信的保密性和完整性。



文章来源: Difference in dealing with ssl certificate in respect of browser and jvm?
标签: java ssl https