SSL证书自动更新并应用到IKEv2, Nginx
目录
SSL证书免费申请和自动续期
申请SSL证书,首先需要避免用被Mozilla 拉黑的沃通(WoSign)及被沃通收购的StartCom. 沃通的一系列乱像和作死的缘由网上搜一下就清楚了.
这里还是推荐由美国加州公益组织ISRG 的 Let’s Encrypt . 优点在于可靠,可自动化,免费,口碑好. 缺点(其实算不上缺点)为有效期只有90天,但是完全可以自动化的进行续期来避免这个问题.
自动申请Let’s Encrypt证书的工具,用的最顺手的自动化工具还是acme.sh.
证书颁发可以看该项目的Github Wiki中文文档 ,写得很详细了.
主要需要注意区分的是:
颁发用
--issue
,仅在首次申请的时候使用(以及配合--dns
并做好dns参数解析)续期用
--renew
,可执行任意次数(如果离过期时间比较远,可使用--force
强制执行更新)
至于自动续期,以域名yourdomain.com
为例:
给
yourdomain.com
设置每30天自动续期:1
acme.sh --days 30 --renew --dns -d yourdomain.com
给
yourdomain.com
的ECC证书设置每30天自动续期1
acme.sh --days 30 --renew --dns --ecc --keylength ec-256 -d yourdomain.com
定时将证书替换到IKEv2
IKEv2使用SSL证书的好处是可以不用导入到客户端,但是也需要注意证书过期对服务的影响.所以在上面一节设置好对Let’s Encrypt证书的自动续期以后,也别忘了将它应用到IPsec服务中来:
写个bash脚本ipsec.sh,用于替换证书并重启服务,注意替换
cert_file
和key_file
为自己的证书和私钥路径:1
2
3
4
5
6
7
8
9
cert_file="/home/user/.acme.sh/yourdomain/yourdomain.cer"
key_file="/home/user/.acme.sh/yourdomain/yourdomain.key"
sudo cp -f $cert_file /usr/local/etc/ipsec.d/certs/server.cert.pem
sudo cp -f $key_file /usr/local/etc/ipsec.d/private/server.pem
sudo cp -f $cert_file /usr/local/etc/ipsec.d/certs/client.cert.pem
sudo cp -f $key_file /usr/local/etc/ipsec.d/private/client.pem
sudo /usr/local/sbin/ipsec restart编写定时任务:
crontab -e
,并注意替换脚本文件的路径:1
59 02 1 * * bash /your/path/to/ipsec.sh > /dev/null
这样,每个月1日的凌晨2点59分就会替换证书并重启IPsec服务.也可以根据自己的需求自行调整参数.
定时将证书替换到Nginx
acme.sh自动申请到的证书不仅可以给IPsec服务使用,也可以给Nginx使用.
既能免于IKEv2自签名CA导入问题的烦恼,又能给自己的站点上HTTPS,一举多得.
虽然acme的脚本带了一些十分方便的参数指定(如keypath, fullchainpath, reloadcmd, 自动部署到apache等)
但也无法满足一些复杂的需求,如同时应用普通证书和ECC证书,同时发布到IPsec等.
因而也可以自己写定时脚本(或者写在上一节的脚本里),步骤和原理同上,也就不多赘述:
bash file
nginx.sh
:1
2
3
4
5
6
sudo cp -f /home/user/.acme.sh/yourdomain/fullchain.cer /path/to/nginx/ssl/fullchain.pem
sudo cp -f /home/user/.acme.sh/yourdomain/yourdomain.key /path/to/nginx/ssl/privatekey.pem
sudo cp -f /home/user/.acme.sh/yourdomain_ecc/fullchain.cer /path/to/nginx/ssl/fullchain.pem
sudo cp -f /home/user/.acme.sh/yourdomain_ecc/yourdomain.key /path/to/nginx/ssl/privatekey.pem
sudo service nginx restartadd crontab:
1
59 02 1 * * bash /your/path/to/nginx.sh > /dev/null