浏览器是如何进行区分你访问的网站是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作为对称加密密钥进行通信
其中使用了一次非对称加密。
后续使用对称加密和解密进行通信。 效率更高