配置 OCSP、OCSP Stapling.note

noteId: WEBb3559a11769b1b5309ec9684d9412b80 · 原始路径:/ALL/Linux - A模块/服务配置/CA根证书颁发机构/OCSP/配置 OCSP、OCSP Stapling.note · 图片:20 · 附件待处理:0

 
一、配置 OCSP:
 
1、什么是 OCSP,有什么作用:
# 什么是OCSP:
OCSP(Online Certificate Status Protocol)在线证书状态协议
它是一个用于实时查询证书是否仍然有效的协议
可以把 OCSP 理解成:一个专门回答“某个证书现在是否被吊销?”的网站(API)
 
# OCSP 有什么作用:
如果某个证书被盗、被黑、丢失,我吊销它之后,客户端怎么知道?
在没有 OCSP 之前,我们使用 CRL(证书吊销列表),CRL 就像一本吊销证书号码的“黑名单”。
但是 CRL 有几个致命问题:
1、客户端下载 CRL 很大(几十 KB ~ 几 MB)
2、CRL 的更新不是实时的(可能1天更新一次)
3、大量客户端访问会导致 CA 服务器压力大
 
因此OCSP被设计出来:
机制            缺点            优点
CRL        不实时,文件大    简单、兼容性好
OCSP       需要OCSP服务器    查询实时、轻量、现代化
# OCSP有两种模式:
1、OCSP Responder(主动查询)    客户端直接访问 OCSP URL查询
2、OCSP Stapling(服务端缓存)    服务器提前向OCSP查询,把结果“装订”在TLS握手里
 
 
2、配置 OCSP:
本地实验将 OCSP网站放在本地(正常环境中,OCSP网站放在哪里都可以,只要客户端能够访问即可)
 
(1)添加 OCSP 字段:
创建的CA、颁发的证书中都必须含有 OCSP 字段
跟证书吊销列表的配置方式是一样的,只不过将 caIssuers 改成 OCSP 而已
# 编辑 openssl.cnf 文件,添加OCSP 字段: 
apt install -y openssl
cd /etc/ssl
vim openssl.cnf
# 模板在 man x509v3_config
 
 
(2)创建 CA、颁发网站证书:
# 创建CA:
cd
/usr/lib/ssl/misc/CA.pl -newca
/usr/lib/ssl/misc/CA.pl -newreq-nodes    //需提前在 openssl.cnf 中填写需要的 DNS字段
/usr/lib/ssl/misc/CA.pl -sign
mv newcert.pem ssl.crt
mv newkey.pem ssl.key
 
 
(3)重要:为 OCSP 创建一张证书:
OCSP的证书必须要带有 OCSPSigning 字段,就像VPN证书必须要有 serverAuth 和 clientAuth 一样
vim /etc/ssl/openssl.cnf
# OCSPSigning 这个字段可以在 man x509v3_config 中抄
 
与VPN证书配置类似
不建议将 AIA加在 OCSP证书中(因为会导致循环,当然,只会发生在老旧客户端上)
不应该加AIA,虽然我这里加了AIA
 
# 颁发证书:
/usr/lib/ssl/misc/CA.pl -newreq-nodes
/usr/lib/ssl/misc/CA.pl -sign
mv newcert.pem ocsp.crt
mv newkey.pem ocsp.key
 
查看证书:
vim ocsp.crt
能够看到 key Usage 中有 OCSP Signing 即可
 
 
(4)创建 OCSP 网站:
OCSP 不需要像 证书吊销那样创建一个网站,它能直接运行一个简单的 HTTP Server
openssl ocsp -index /root/demoCA/index.txt -port 80 -rsigner ocsp.crt -rkey ocsp.key -CA ca.crt -text
要让它在后台运行,在命令结尾加一个 &
然后按 Ctrl + C 退出,程序就挂在后台了:
 
·假设 OCSP 在其他机器(不在 CA上):
index.txt 文件不在本地
# 解决方法:
使用 NFS 同步整个CA目录过去即可(如果网络不通也得打通,要么就是放行 NFS端口: TCP 2049)
 
 
(5)配置 重启不失效:
# 因为它是使用命令来运行一个临时的 HTTP 进程的,重启就会失效,因此我们可以做以下配置:
1、使用 crontab @reboot 参数,重启自动执行
2、配置成 .service 服务,然后自启动
 
·配置 crontab 自动执行:
vim /etc/crontab
# 结尾不能加 &,否则端口能起来,OCSP不工作
这种方式虽然能够快捷的达到效果,但是如果出现意外停止就不会自动恢复,如果比赛时没多少时间、追求速度 就可以使用这种方式
 
·配置成 .service 服务:
这是最稳定的方式
cd /etc/systemd/system
cp sshd.service ocspd.service    //直接复制sshd的文件
vim ocspd.service
systemctl daemon-reload
systemctl enable ocspd
systemctl start ocspd
 
# 关于 Restart=always 和 Restart=on-failure的区别:
Restart=always    //无论退出原因,都会重启
Restart=on-failure    //只有返回“失败、崩溃”这些退出原因,才会重启
 
# 当然如果记不住,用sshd默认的 Restart=on-failure 也是问题不大的
 
 
 
·测试 OCSP 网站:
测试证书:
openssl ocsp -issuer ca.crt -cert ssl.crt -url http://172.16.1.2 -text
# -issuer    //签发证书的根CA
# -cert    //要验证的CA
# -url    //ocsp网站地址
 
 
将该证书吊销:
# 将证书吊销:
openssl ca -revoke ssl.crt
 
#(可选)重新生成 CRL(单独OCSP环境不需要,如果有CDP/AIA就需要更新crl):
openssl ca -gencrl -out ca.crl
 
 
再次测试该证书:
可以看到,这里已经验证该证书被吊销了
 
 
二、在 网站中 启用 OCSP Stapling:
 
(1)Apache2:
假设已经配置好了 Apache2、OCSP
# 确保启用 socache_shmcb 模块(默认启用,但是不排除排错会考)
a2enmod socache_shmcb
 
还要确保ssl模块启用:
a2enmod ssl
 
# 手动创建ocsp缓存配置:
vim /etc/apache2/conf-enabled/ocsp.conf
 
# 编辑配置文件:
vim /etc/apache2/site-enabled/000-default.conf
这里必须要指定 根CA,否则OCSP无法验证
如果是 根CA + 子CA环境,必须提供完整的证书链,直接cat将两张证书合成一张(根CA + 子CA)(否则客户端能访问,apache无法提供 OCSP Stapling)
systemctl restart apache2
 
·测试:
证书不需要严格包含有网站域名,但是必须要能够信任,使用 * 通配符匹配网站域名也是可以的
echo QUIT | openssl s_client -connect www.shanghai.org:443 -status | grep OCSP
 
如果没有成功,会提示:no response sent
 
 
(2)Nginx:
有时可能OCSP Stapling访问失败,那么就将ssl证书和ca根证书合成一个文件,放到 ssl_certificate中(注意ssl证书在前,ca证书在后):
cat ssl.crt ca.crt > new.crt //然后ssl_certificate调用这个证书即可
vim /etc/nginx/site-enabled/default
# resolver可选配置,用于指定解析OCSP域名的DNS服务器地址
 
·测试:
echo QUIT | openssl s_client -connect www.shanghai.org:443 -status | grep OCSP
 
·Nginx 反向代理也可以配置 OCSP Stapling,一样的配置方式
 
 
(3)Squid代理 暂时不支持 OCSP Stapling
 
(4)Hapxory代理 每次都需要手动抓取 OCSP的状态文件,应该也不常考