目录

  1. SSL证书免费申请和自动续期
  2. 定时将证书替换到IKEv2
  3. 定时将证书替换到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_filekey_file为自己的证书和私钥路径:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /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 ,并注意替换脚本文件的路径:

    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
    #! /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:

    1
    59 02 1 * * bash /your/path/to/nginx.sh > /dev/null