申请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天自动续期:
acme.sh --days 30 --renew --dns -d yourdomain.com
给 yourdomain.com 的ECC证书设置每30天自动续期
acme.sh --days 30 --renew --dns --ecc --keylength ec-256 -d yourdomain.com
定时将证书替换到IKEv2IKEv2使用SSL证书的好处是可以不用导入到客户端,但是也需要注意证书过期对服务的影响.所以在上面一节设置好对Let’s Encrypt证书的自动续期以后,也别忘了将它应用到IPsec服务中来:
写个bash脚本ipsec.sh,用于替换证书并重启服务,注意替换 cert_file 和 key_file 为自己的证书和私钥路径:
#! /bin/bash 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 ,并注意替换脚本文件的路径:
59 02 1 * * bash /your/path/to/ipsec.sh >dev/null
这样,每个月1日的凌晨2点59分就会替换证书并重启IPsec服务.也可以根据自己的需求自行调整参数.
定时将证书替换到Nginxacme.sh自动申请到的证书不仅可以给IPsec服务使用,也可以给Nginx使用.
既能免于IKEv2自签名CA导入问题的烦恼,又能给自己的站点上HTTPS,一举多得.
虽然acme的脚本带了一些十分方便的参数指定(如keypath, fullchainpath, reloadcmd, 自动部署到apache等)
但也无法满足一些复杂的需求,如同时应用普通证书和ECC证书,同时发布到IPsec等.
因而也可以自己写定时脚本(或者写在上一节的脚本里),步骤和原理同上,也就不多赘述:
bash file nginx.sh :
#! /bin/bash 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 restart
add crontab:
59 02 1 * * bash /your/path/to/nginx.sh >dev/null