Let’s Encrypt 通配符证书申请+使用双证书

之前的数字证书都是使用RSA的,现在有新的一种签名算法:ECDSA,使用ECDSA算法签名的数字证书也叫做ECC证书。

ECC证书的好处

使用ECC证书中有用户公钥,相比于之前RSA证书而言,256位ECC key就能起到相当于3072位的RSA key的安全性。另外一点就是ECC的运算速度相对以同等安全性的RSA的速度要快上很多,这样就可以减少服务器的资源开销,并且ECC证书证书文件会比RSA证书文件要小上很多。

现在Let’s Encrypt的兼容性也挺高的,Let’s Encrypt 由 ISRG(Internet Security Research Group,互联网安全研究小组)提供了免费、自动化、开放的证书签发服务,虽然证书只有 90 天有效期,但可以通过定时脚本更新,目前acme.sh项目挺方便的,它是一个实现 ACME 协议的客户端,能够向支持 ACME 协议的 CA 申请证书(如 Letsencrypt)。 最重要的是它对接了大多数的域名服务商,能够通过域名服务商提供的 API,自动的添加 DNS 验证记录进行全自动颁发证书,还可以模拟 HTTP 服务器进行文件验证。so,不管你的证书期限是 90 天,还是更短,再也不用担心证书过期的问题了。
至于 ACME 协议是什么?Automatic Certificate Management Environment 自动化证书管理环境,通过它我们可以实现证书的自动申请以及部署,可以大大的节省人员的管理及额外的配置工作。
好了,废话不多说。

安装 acme.sh

acme.sh 下载非常的简单,官方提供了 2 中方式:

  1. 通过执行在线脚本安装:

  2. $ curl https://get.acme.sh | sh
    # 或者
    $ wget -O - https://get.acme.sh | sh

  3. 通过 git 安装:

  4. git clone https://github.com/Neilpang/acme.sh.git
    cd ./acme.sh
    ./acme.sh --install

在安装的过程中,做了 3 件事:

  • 复制 acme.sh 到你的 HOME 目录($HOME):~/.acme.sh/。之后所有生成的证书也会放在这里。
  • 创建别名:acme.sh=~/.acme.sh/acme.sh
  • 创建 cron 每日任务去检查是否有证书需要更新。 如: 0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
  • 使用 acme.sh

    如何使用?acme.sh 的功能非常的强大,使用方式确非常的简单。提醒,该脚本需要在你的服务器下执行。官方地址:How to issue a cert
    关于 ECC 证书,你只需要再末尾添加 –keylength ec-256。如:
    $ acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
    可选长度有:

  • ec-256 (prime256v1, “ECDSA P-256”)
  • ec-384 (secp384r1, “ECDSA P-384”)
  • ec-521 (secp521r1, “ECDSA P-521”, which is not supported by Let’s Encrypt yet.)
  • 具体的大家可以参考上面的官方说明

    申请通配符证书

    首先我们需要确认你使用的是什么DNS服务商,只有在DNSapi上的才支持添加通配符证书。
    我们已CloudFlare为例

    #首先在CloudFlare后台把CF key复制出来使用以下命令导入到系统
    export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export CF_Email="[email protected]"
    #然后就可以用以下命令申请证书,全程DNS自动验证
    acme.sh --issue --dns dns_cf -d example.com -d *.example.com

    本人使用以下命令生成证书

    #生成RSA证书
    acme.sh --issue -d example.com -d *.example.com --dns dns_cf --dnssleep 30 --ocsp
    #生成ECC证书
    acme.sh --issue -d example.com -d *.example.com --dns dns_cf --dnssleep 30 --keylength ec-384 --ocsp

    安装证书

    再颁发证书之后,我们可能需要将证书拷贝到指定位置。那么我们需要使用到 –install-cert 命令,请尽量避免手动拷贝证书。
    # Apache RSA
    $ acme.sh --install-cert -d example.com \
    --cert-file /path/to/certfile/in/apache/cert.pem \
    --key-file /path/to/keyfile/in/apache/key.pem \
    --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
    --reloadcmd "service apache2 force-reload"
    # Nginx RSA
    $ acme.sh --install-cert -d example.com \
    --key-file /path/to/keyfile/in/nginx/key.pem \
    --fullchain-file /path/to/fullchain/nginx/cert.pem \
    --reloadcmd "service nginx force-reload"
    # Apache ECC
    $ acme.sh --install-cert -d example.com --ecc \
    --cert-file /path/to/certfile/in/apache/cert.pem \
    --key-file /path/to/keyfile/in/apache/key.pem \
    --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
    --reloadcmd "service apache2 force-reload"
    # Nginx ECC
    $ acme.sh --install-cert -d example.com --ecc \
    --key-file /path/to/keyfile/in/nginx_ecc/key.pem \
    --fullchain-file /path/to/fullchain/nginx_ecc/cert.pem \
    --reloadcmd "service nginx force-reload"

    这里会将私钥、证书、证书链拷贝到指定位置,成功后执行 –reloadcmd 命令。请确保有执行这些命令的权限。
    当然你也不用担心证书更新的问题,在证书 60 天之后,会自动更新,更新后就会执行 –reloadcmd 的命令。
    这里还有一些 hook 功能,请查看帮助 $ acme.sh -h,如,–renew-hook(每次证书成功更新后执行的命令)等。

    更新证书

    使用该工具的应该都是冲着其强大的自动更新部署功能来的。当然,如果你想手动更新:
    # RSA
    acme.sh --renew -d example.com --force
    # ECC
    acme.sh --renew -d example.com --force --ecc

    如何部署双证书

    因为我使用的是Nginx,所以这里就只讲Nginx的部署。
    重要提示:Nginx只有在版本1.11以后(包括1.11)才支持部署双证书,所以版本不够的同学需要先升级Nginx,可以使用nginx -V查看。
    准备好RSA和ECC两套证书和私钥文件,然后在配置文件中添加:
    # ecc certificate
    ssl_certificate /path/to/fullchain/nginx_ecc/cert.pem;
    ssl_certificate_key /path/to/keyfile/in/nginx_ecc/key.pem;

    # rsa certificate
    ssl_certificate /path/to/fullchain/nginx/cert.pem;
    ssl_certificate_key /path/to/keyfile/in/nginx/key.pem;

    ssl_ciphers ECDSA:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES256:RSA+AES128:RSA+AES256:!NULL:!aNULL:!MD5:!ADH:!DH:!RC4:!DES;
    ssl_prefer_server_ciphers on;

    有一点需要注意,如果希望默认使用ECC证书需要把ECDSA套件添加在前面,例如ECDHE_ECDSA的套件放在前面,如果不这样做的话,配置的加密套件最优先的RSA加密套件,那么会默认使用RSA的证书。当这些完成后,就可以使用ssllabs或者myssl去检测一下双证书的部署状况了。

    测试结果

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用*标注