目录
测试:“嘿嘿,我又发现了一个BUG,这个证书明明已经被吊销了为啥没有吊销提示!”
“好吧,我看看”,心里想证书吊销不是自动判读的吗?难道还会和证书有关,自己测试了一把,我去还真是认为是没有被吊销的。
经过查看,发现如果是正常的判断,也就是我们目前使用的证书技术的确是自动判断的,只要能上网就能通过证书序列号判断这个证书的吊销状态。
但是,chromium浏览器默认使用了自己的吊销判断也就是crlset,刚开始接触chromium证书吊销的时候在代码中看到了crlset还是以为用的是crl,我们最常用的两种方式ocsp和crl来做吊销判断。
原来chromium浏览器将吊销证书放置与代码中(我去,静态的!!!那我怎么知道有哪些是吊销的?只能一个一个加到代码中,这样的设计会不会有点太low呀,也不知道chromium怎么想)
我们来看是如何加入到代码中的吧。
系统版本:UOS
需要工具:uos浏览器
第一步:下载证书。
随便一个浏览器打开被吊销的网站:例如:https://revoked.badssl.com/
第二步、获取 公钥的hash值
执行命令:获取16进制数据
openssl x509 -in revoked.badssl.com -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -c | awk '{print "0x" $2}' | sed 's/:/, 0x/g'
解释一下,大概的意思就是将公钥从证书中获取出来| 然后转化为二进制der格式 | 然后使用sha256哈希算法获取 | 一段16进制字符串 | 然后将字符串中的":"替换车给你“, 0x”
将revoked.badssl.com 修改为你下载的证书名字,就可以了。然后就获取一段16进制的数据。
0xc6, 0x91, 0x0d, 0x0b, 0xa9, 0xed, 0xdf, 0x59, 0x33, 0x34, 0x14, 0x9f, 0xed, 0xfe, 0x87, 0x38, 0x5f, 0x37, 0xb6, 0x25, 0x35, 0x4b, 0xb4, 0x39, 0x5c, 0x0a, 0xe2, 0xc8, 0xdf, 0x48, 0xe1, 0x7c
cert_verify_proc_blocklist.inc添加到 kSPKIBlockList变量中。
第三步、重新编译运行。
注意清空缓存,你会发现浏览器就会出现提示他的证书被吊销了。
扩展
我们知道crl是通过下载吊销列表,然后进行对比,如果找到了该证书的序列号就表明该证书已经被吊销,那么他是如何校验的呢?我们手动的来测试一把。
crl校验过程,
测试网站:https://revoked.badssl.com/
第一步 获取证书:
获取网站证书和中间证书。
网站证书保存名字为:www_cert.pem
中间证书保存名字为:www_chain.pem
第二步 获取crl分发地址
openssl x509 -in www_cert.pem -noout -text | grep crl
获取crl地址
第三步 下载crl文件
wget http://crl3.digicert.com/ssca-sha2-g6.crl -O gn.crl
第四步 将 CRLs文件转化为pem格式
openssl crl -inform DER -in gn.crl -outform PEM -out crl.pem
第五步 合并中间证书和CRLs文件
cat www_chain.pem crl.pem > crl_chain.pem
第六步 开始校验
openssl verify -crl_check -CAfile crl_chain.pem www_cert.pem
输出结果如下
C = US, ST = California, L = Walnut Creek, O = Lucas Garron Torres, CN = revoked.badssl.com
error 23 at 0 depth lookup: certificate revoked
error www_cert.pem: verification failed
可以看到该证书显示是被吊销的,操作过程中我们需要下载CRLs文件,随着时间推移这个文件会越来越大,因此在校验的时候会比较费时。不推荐。
OCSP 校验过程
第一步 获取OCSP地址
openssl x509 -in www_cert.pem -noout -ocsp_uri
输出结果:http://ocsp.digicert.com
第二步 校验ocsp
openssl ocsp -issuer www_chain.pem -cert www_cert.pem -CAfile www_chain.pem -no_nonce --text -url http://ocsp.digicert.com -header Host=ocsp.digicert.com
输出结果如下:
OCSP Request Data:
Version: 1 (0x0)
Requestor List:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: 105FA67A80089DB5279F35CE830B43889EA3C70D
Issuer Key Hash: 0F80611C823161D52F28E78D4638B42CE1C6D9E2
Serial Number: 0371B58A86F6CE9C3ECB7BF42F9208FC
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: 0F80611C823161D52F28E78D4638B42CE1C6D9E2
Produced At: Nov 15 10:38:51 2020 GMT
Responses:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: 105FA67A80089DB5279F35CE830B43889EA3C70D
Issuer Key Hash: 0F80611C823161D52F28E78D4638B42CE1C6D9E2
Serial Number: 0371B58A86F6CE9C3ECB7BF42F9208FC
Cert Status: revoked
Revocation Time: Oct 7 20:30:39 2019 GMT
This Update: Nov 15 10:38:51 2020 GMT
Next Update: Nov 22 09:53:51 2020 GMT
Signature Algorithm: sha256WithRSAEncryption
b0:f1:42:fb:64:e1:d6:e9:e3:fb:e6:fd:7f:57:47:80:ad:83:
ce:38:f4:bc:e4:0c:23:ee:1d:d0:8e:05:c1:63:3e:1b:13:f4:
54:47:c3:1d:58:d0:17:d2:76:5d:26:cd:8a:a3:4b:51:c2:cb:
24:b7:b4:d8:26:7e:1d:32:a1:08:26:e3:3e:7b:10:52:ec:96:
1f:52:a3:e4:51:8b:22:98:70:b2:64:e6:1f:68:a1:31:8f:7d:
42:0b:5b:c6:e7:a4:62:ae:de:46:ef:a8:ff:d2:95:71:55:ad:
ad:eb:0f:82:df:94:1a:3e:fa:31:47:46:20:76:e1:ef:be:ee:
fc:76:59:2b:6b:c4:f9:ad:82:91:7c:29:28:4e:45:70:0e:ed:
bd:8b:bd:63:26:a6:7e:d3:10:1d:4c:a0:4f:9a:c4:11:e0:c3:
26:3e:c5:b4:19:77:92:58:0a:92:7f:e6:42:0a:65:6a:a4:01:
b7:67:59:cd:cc:97:a1:22:a9:00:2a:59:42:41:ee:b0:bd:b8:
5f:7e:07:ee:42:98:ab:27:68:83:c8:9f:91:b8:0b:b2:a9:37:
18:94:7b:00:03:75:2a:3d:2d:0c:d6:cf:04:80:3b:a3:11:fc:
7c:ab:da:b1:d8:c9:86:33:7f:7f:77:43:0d:50:f5:fd:01:ee:
d4:05:ed:62
Response verify OK
www_cert.pem: revoked
This Update: Nov 15 10:38:51 2020 GMT
Next Update: Nov 22 09:53:51 2020 GMT
Revocation Time: Oct 7 20:30:39 2019 GMT
ocsp需要能于ocsp服务器进行通信才能校验。
校验OCSP 封装
服务器不支持
openssl s_client -connect revoked.badssl.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i ocsp
输出
OCSP response: no response sent