HTTPS(二)证书合法性校验

在客户端与服务端的连接过程中,服务端会把证书发给客户端,客户端需要基于CA认证体系对证书的合法性进行验证
一、 权威认证机构
1、在CA认证体系中,所有的证书都是由权威机构来颁发
2、CA根证书的来源有两种,一种是操作系统中内置的的,另外一种就是浏览器自带的
windows在可以在运行->certmgr.msc

 

 

二、 证书验证过程
1、服务方向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
2、CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
3、如信息审核通过,CA会向申请者签发认证文件-证书。
1)证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
2)签名的产生算法:
首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA的私钥对信息摘要进行加密,密文即签名;
4、客户端向服务端发出请求时,服务端返回证书文件;
5、客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
6、客户端验证证书相关的域名信息、有效时间等信息;
7、客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

在这个过程注意几点:
1、申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
2、证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
3、内置CA对应的证书称为根证书
4、证书=公钥(服务方生成密码对中的公钥)+申请者与颁发者信息+签名(用CA机构生成的密码对的私钥进行签名);

三、中间证书
如果服务方的证书不是直接向根证书颁发机构申请的,而是向根证书颁发机构的授权机构申请的,此时的证书验证,就是由下往上逐级进行验证。
如下是baidu服务器返回的证书,可以看到www.baidu.com的证书是由GlobalSign G2签发的,而GlobalSign G2是由GlobalSign Root(根证书)签发的。
即baidu的证书合法性由GlobalSign G2保证,而GlobalSign G2由GlobalSign Root保证其合法性,如果GlobalSign G2是合法的,那么baidu的证书就是合法的。

 

 抓包分析,在Cerfiticate阶段,发送了两个证书,一个baidu.com的证书,一个GlobalSign G2的证书

 

 一个证书包括待签名证书内容,签名算法,证书签名

 

 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;

 

 证书GlobalSign G2的签发CA是根CA,使用系统内置的根证书进行认证。

四、 证书链的缺失
有些情况下,我们使用不同的浏览器去访问相同的域名,可能会出现某些浏览器显示该域名可信,某些浏览器显示不可信,那有可能就是证书链不完整导致的,也就是中间证书缺失。
现代的浏览器都有证书自动下载的功能,但很多浏览器在安装后是使用系统内置的证书库,如果你缺失的那张CA证书,在系统的内置证书库中不存在的话,即使你的证书确实是可信的,但依旧会显示成不可信,只有等到浏览器自动把缺失的那张CA证书从网上下载下来之后,访问该网站才会显示成可信状态。
有一些版本安卓设备的应用不会自动下载补全正式,导致显示不可信,那么我们可以手动将证书链补全,然后更新服务端的证书,这样设备下载证书的时候,就是完整的证书链,就不会出现不可信的状态。
https://myssl.com/chain_download.html 此网站提供证书链补全的功能

五、 申请免费的证书
Let's Encrypt 可以提供免费的证书申请,但是需要每三个月进行一次续签
1、安装acme

git clone https://github.com/Neilpang/acme.sh.git 
cd acme.sh/ 
./acme.sh --install 
安装后自动设置定时任务 定时任务会在每天0点47分调用acme.sh程序,以检查证实是否过期,是否需要续签等
 # crontab -l 47 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

2、设置阿里DNS子账号
由于需要使用阿里dns进行验证,所以可以设置子账号
创建阿里云dns子账户,获取子账号的key和secret

export Ali_Key="xxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxx"
/root/.acme.sh/acme.sh --issue -d tenserpay.xyz -d *.tenserpay.xyz --dns dns_ali --keylength ec-256 --ecc --log --force
执行后,这些信息会记录在相关目录中,后续的执行将自动执行
参数:
–issue:签发,
--dns dns_ali:指明使用“dns_ali”作为验证方式
-d:指定证书中的域名

# ll /root/.acme.sh/tenserpay.xyz_ecc/
total 28
-rw-r--r-- 1 root root 1648 Oct 14 09:33 ca.cer   # Let’s Encrypt的中级证书
-rw-r--r-- 1 root root 3303 Oct 14 09:33 fullchain.cer # 包含中级证书的域名证书
-rw-r--r-- 1 root root 1655 Oct 14 09:33 tenserpay.xyz.cer # 无中级证书的域名证书
-rw-r--r-- 1 root root  630 Oct 14 09:33 tenserpay.xyz.conf # 该域名的配置文件
-rw-r--r-- 1 root root  460 Oct 14 09:32 tenserpay.xyz.csr # 该域名的CSR证书请求文件
-rw-r--r-- 1 root root  228 Oct 14 09:32 tenserpay.xyz.csr.conf # 该域名的CSR请求文件的配置文件
-rw-r--r-- 1 root root  302 Oct 14 09:32 tenserpay.xyz.key # 该域名证书的私钥

 

posted @ 2020-10-14 14:50  guoxianqi  阅读(2498)  评论(0编辑  收藏  举报