浏览器是如何进行区分你访问的网站是http还是https呢

浏览器是如何进行区分你访问的网站是http还是https呢?

      我用具体的操作进行分析。你也可以操作一下

 

我们在浏览器的地址栏中输入一个域名 taobao.com(不要按回车), 然后你将地址栏  ctrl+a 进行复制,粘贴到文本文件后,发现是http://taobao.com/  ,这是浏览器的默认解析,为其封装http协议和 80端口号。

那https呢,它是在服务端配置的。(不然浏览器不会出现https)

举个例子:

      以Nginx服务器为例,它是监听80端口,等待请求的访问,在监听的80端口上设置url重定向指向监听端口为443的https协议的网站, 这样浏览器就返回的是 https协议。

server {
        listen      80;              // 监听80
        rewrite ^(.*)$ https://$host$1 permanent;  // 切换https
        access_log  logs/host.access.log  main;
        location / {
            #root  /var/local/www; // 此处的目录不在发挥作用
            #autoindex_format html;
            index  index.html index.htm;
        }
}
server {
        listen       443 ssl;         // 监听443端口
        access_log  logs/host.log  main;
        ssl_certificate      cert/junjunyou.top.pem; // 配置公钥
        ssl_certificate_key  cert/junjunyou.top.key; // 私钥

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;  // 选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同
        ssl_prefer_server_ciphers  on; 

        location / {
            root   /var/local/www;       // 443端口所只想的目录
            index  index.html index.htm;
        }
    }

 

   浏览器中输入taobao.com , 并按下回车键,进行访问,此时,将地址栏中 内容进行拷贝,会发现已经成了  https://www.taobao.com/  浏览器默认为  https封装443端口号。

然后将其证书(ssl_certificate)【他也将作为一个服务器公钥后续使用】传回给客户端,客户端先进行验证

如果验证失败,那么放弃请求

如果验证成功,那么随机生成一个随机数作为对称加密的密钥B 使用服务器传回来的 证书对随机数进行加密,生成client key 发送给服务器

服务器使用私钥(ssl_certificate_key) 进行解密(非对称),得到客户端的的  对称加密密钥B

最后,浏览器和服务器之间使用密钥B作为对称加密密钥进行通信

 

其中使用了一次非对称加密。

后续使用对称加密和解密进行通信。 效率更高

你可能感兴趣的:(计算机网络)