HTTPS协议访问网址为何浏览器提示不安全
一、现象描述#
使用 https 协议访问某个地址时,浏览器会出现如下的风险提示:
以及这样的提示: NET::ERR_CERT_AUTHORITY_INVALID
二、出现原因#
浏览器与服务器 (访问的网址) 交互时,SSL 证书验证失败:
- 1、SSL 证书不是由受信任的 CA 机构颁发的
a)服务器本身没有加密证书 b)用户电脑找不到对应的证书
- 2、证书过期
- 3、访问的网站域名与证书绑定的域名不一致
三、解决方案(本文不会介绍如何制作证书)#
第一种)购买商业证书,由 CA 机构颁发,使用证书绑定的域名访问网站。
第二种)自己按照规范要求制作一套证书文件:
网关证书 cert.pfx
发行者证书:ca.cer
用户电脑安装 ca.cer 证书; cert.pfx 和 ca.cer 证书需要上传到服务器
额外补充:
如果是 get 请求直接访问网站,会出现不受信的提示,点击隐藏按钮,可以继续访问,代表这个浏览器把此网站标记为受信网站 ,则不会每次出现提示。 注意地址栏上显示的依旧是不可信。
如果是采用的 ajax 请求,是没有机会点击这个隐藏按钮的,所以一定需要证书。
四、许多疑问#
证书包含什么?#
SSL 证书是由数字证书颁发机构(CA)经过一系列的严格审核而签发的,包含如下信息:
1)地址栏:安全锁、https 标志、企业名称(仅 EV 类型证书)。
示例:扩展验证 EV SSL 证书在浏览器的显示效果
2)常规:证书的使用者、颁发者和有效,如下图
3)详细信息:证书版本、序列号、签名算法、加密算法、公钥、有效期及使用者的详细信息(如省市、企业名等),如下图
证书如何申请?#
SSL 证书可以向 CA 机构通过付费的方式申请,也可以自己制作。
证书与域名的关系?#
一个证书一般只绑定一个域名,CA 机构也提供申请通配符域名(例如,*.runoob.com),通配符域名相当于绑定了主域名下的所有域名,因此使用起来非常方便,但是价格也超级昂贵,几乎只有企业才可以申请。
浏览器如何验证证书?#
在浏览器的菜单中,找到并点击 “Internet 选项”,选择 “内容” 标签,点击 “证书” 按钮,然后就可以看到浏览器已经信任了许多 “中级证书颁发机构” 和 “受信任的根证书颁发机构”。当我们在访问该网站时,浏览器就会自动下载该网站的 SSL 证书,并对证书的安全性进行检查。
浏览器需要验证 SSL 证书的 5 个方面:
第一,验证浏览器中 “受信任的根证书颁发机构” 是否存在颁发该 SSL 证书的机构。
第二,检查证书有没有被证书颁发机构吊销。
第三,验证该网站的 SSL 证书是否过期。
第四,审核该 SSL 证书的网站的域名是否与证书中的域名一致。
第五,该网站有没有被列入欺诈网站黑名单。
根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。
电脑上的证书在哪里?#
操作系统在安装过程中会默认安装一些受信任的 CA 机构的根证书,可以在” 运行” 里面运行”certmgr.msc” 启动证书管理器,如下图所示:
五、简单科普#
HTTPS 协议#
a) 超文本传输安全协议(Hypertext Transfer Protocol Secure,常称为 HTTP over TLS,HTTP over SSL 或 HTTP Secure)是一种网络安全传输协议。
b) 经由超文本传输协议(HTTP)进行通信,但利用 SSL/TLS 来加密数据包。默认端口 443。
SSL 是什么?#
SSL 是一个中间层协议,介于传输层和应用层之间,属于 Socket 层的实现,与应用层协议无关,可以透明的建立在应用层协议之上。
SSL 是一个分层协议,由记录层和握手层组成。其中,握手层包含 SSL 握手协议,SSL 修改密码规范协议,SSL 告警协议,记录层包括 SSL 记录协议。
SSL 握手协议#
SSL 握手协议建立在 SSL 记录协议之上,用于在实际的数据传输开始前通信双方进行身份认证,加密算法协商,加密密钥交换等
握手协议由一系列在客户和服务器间交换的报文组成。每个报文由类型,长度,内容三部分组成
1. 类型(1 字节),指 SSL 握手协议报文类型
2. 字节(3 字节),以字节为单位的报文长度
3. 内容。使用报文有关的内容参数
SSL 协议的握手过程#
1. 客户端向服务器发送问候消息,该消息包含 SSL 版本号,随机数,会话 ID,密码套件,压缩方法等信息
- 随机数。一个用于生成主密钥的 32 字节随机数
- 会话 ID。客户端在此次连接中想使用的会话标识符
- 密码套件。每个密码套件以 SSL 开头,用 WITH 分割密钥交换算法,加密算法,散列算法
2. 服务器向客户端返回问候消息
3. 服务器将自己的证书附在问候消息之后,使客户端能用服务器证书中的公钥认证服务器
4. 密钥交换方法有 6 种:无,RSA,匿名 Diffle-hellman,固定 Diffle-hellman 和 Fortezza。如果阶段一协商的交换算法为 Fortezza,则服务器需要向客户端发送一条服务器密钥交换消息。
5. 如果服务器要求验证客户端,则向客户端发送一个客户证书请求
6. 服务器发送问候结束消息,并等待客户端响应
7. 客户端利用服务器响应消息认证服务器的真实身份,如果服务器要求认证客户端,客户端就对双方都已知且在握手过程中的唯一一段数据进行签名,然后把签名后的数据连同自己的证书发送给服务器。
8. 客户端密钥交换阶段,客户端根据交互得到的所有信息生成会话预备主密钥 pre_master_sercet,并用服务器的公钥加密后发送给服务器
9. 客户端利用 pre_master_sercet 生成主密钥 master_sercet,然后利用主密钥生成会话密钥 session_sercet,客户端向服务器发送一条修改密码规范消息,通知服务器以后从客户端来的消息将用 session_sercet 加密
10. 客户端向服务器发送握手结束消息,表明握手过程中客户端部分已经完成
11. 服务端利用私钥解密 pre_master_sercet,利用相同的方式生成主密钥 master_sercet,再生成会话密钥 session_sercet,通知客户端以后从服务端来的消息将用 session_sercet 加密
12. 服务端向客户端发送握手结束消息,表明握手过程中服务端部分已经完成
这里服务端与客户端互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常加密解密数据,为后续真正数据的传输做一次测试。
另外,HTTPS 一般使用的加密与 HASH 算法如下:
- 非对称加密算法:RSA,DSA/DSS
- 对称加密算法:AES,RC4,3DES
- HASH 算法:MD5,SHA1,SHA256
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: