使用免费 Let’s Encrypt 实现 ECDSA/RSA 双证书

Ubuntu 16.04.01 自带的软件源中的是 Nginx 1.10.0,但是这个版本的 Nginx 的 HTTP/2 模块中存在 Bug,具体见此。现在 Nginx 1.12 Stable 已经推出,直接安装 Stable 版本即可。

关于双证书,仅建议使用独立 IP 的人去使用,如果没有独立 IP,那么就需要启用 SNI 功能——然而几乎所有支持 SNI 功能的浏览器也都支持了 ECC 证书,所以可以跳过升级步骤,直接换 Let’s Encrypt 的 ECC 证书,不使用 RSA 证书。

我有不止一个服务器,如果都使用自己编译的 Nginx,那么太麻烦了,于是我决定使用添加软件源的方法,通过 apt 升级,方法如下:

首先需要先添加 Nginx mainline 的软件源:

然后移除现有 Nginx 并安装新版本:

安装时可能会询问是否替换原来默认的配置文件,选择 N 即可。

此时安装的 Nginx 已经包含了几乎所有的必要和常用模块,比如包括但不限于 GeoIP Module、HTTP Substitutions Filter Module、HTTP Echo Module。我安装的 Nginx 的 OpenSSL 版本是 1.0.2g-fips,所以并不支持 CHACHA20,想要支持 CHACHA20 只能使用 CloudFlare 的 Patch 然后自己编译。安装完成后就可以验证 Nginx 版本了:

此时,你的服务器就没有 Nginx 的 HTTP/2 bug 了,既然使用了最新版的 Nginx,那么就能够配置 ECDSA/RSA 双证书了。

Nginx 升级的小坑

在我升级的时候,遇到了 GeoIP 模块无法使用的问题,经研究发现是新版本将 GeoIP 改成动态调用模块的方式实现了,在 Nginx 的 http {} 配置中添加下方代码得以解决:

使用 Let’s Encrypt 签发免费多域名证书

Let’s Encrypt 提供完全面为免费,并且是自动化签发的证书,一张证书最多能签 100 个域名,暂不支持通配。

为了配置双证书,你首先应该签发下来两张证书,以下以 acme.sh 为例,首先先建立目录(以下所有案例均使用 example.com 作为例子,实际使用需自行替换):

然后修改 Nginx 配置文件,确保所有在监听 80 端口的都有 location ^~ /.well-known/acme-challenge/ 区块,本配置文件是强制跳转 HTTPS 的案例,这是源站的配置:

在签发之前,确保所有要签发的域名都指向了你自己的服务器!

然后签发 RSA 证书(如果需要多域名证书,只需要多个 -d 即可,下同,不过保存的文件目录以及证书显示名称均为第一个域名):

然后再签发 ECDSA 证书:

卸载 acme.sh 自带的 cron,自己重新配置:

输入以下内容,注意替换 acme.sh 的路径为你安装的绝对路径:

然后就完成了,证书会自动续签。

给证书添加或删除域名

因为 Let’s Encrypt 使用的不是通配符域名,所以会经常遇到有新的子域的情况,此时就需要给证书添加域名,一张证书最多可以添加 100 个域名。最简单的添加方法如下:

首先,修改证书的配置文件,两个证书的配置文件都要修改:

找到 Le_Alt 一行,将新的域名添加进后面(每个域名用逗号隔开,总共不能超过 100 个)。然后开始重新签发这个证书,需要添加 -f 。

要注意的一点是,目前 Let’s Encrypt 签发的 ECC 证书的中间证书和根证书暂且不是 ECC 证书,这将会在以后支持,详情见 Upcoming Features

配置 Nginx

首先需要生成几个 Key:

然后添加以下内容进 Nginx,放在 http 或 server 区块下,虽然不支持 CHACHA20,但是添加进去也没影响。

最后不要忘了 nginx -s reload ,然后 前往 SSL Labs 检查配置,可以看到旧的浏览器使用了 RSA 证书(我的服务器有独立 IP,所以无 SNI 支持的也能访问):

至此,ECDSA/RSA 双证书配置完成,你可以在浏览器里查看到证书类型:

  • 最后修改日期:2017-06-24
  • 更新日志:将 cron 的路径改为绝对路径;补充关于双证书的说明,以及 Nginx 1.10.2 中 Bug 已经修复的说明

“使用免费 Let’s Encrypt 实现 ECDSA/RSA 双证书”的14个回复

  1. 额 博主我又来了,讨教个问题 ,到hsts,提交,给我检测提示,”http页面不要有hsts的标识”,想了半天,怀疑是http转向https这里有问题,才会有检测到80 http的,之后我换了好几个写法都没通过郁闷了,所以到你这讨教个写法 参考
    即 带w和不带w的域名,同时301到 不带w的 https.

    我这边手机浏览了不方便贴代码就不发我自己的了,多谢

  2. 嗨,请问像我这样已经在使用lets证书的 怎样更换成ecc呢?谢谢难道要删掉之前的证书然后重新申请?

    1. 你是说安装了 HTTPS 后就不能关闭 HTTPS?以后是可以关闭 HTTPS 的,但会对尝试进行 HTTPS 访问的用户会无法再次访问 HTTPS 版本的网站,和安装证书种类无关。前提是你得不开启 “强制 HTTPS 跳转”。

      关于你的第二个问题,Let’s Encrypt 是被很多大厂赞助支持的全新的证书签发商,创立之初就是为了提供完全免费、自动化签发的证书,目的为了就是让更多的网站能用上 HTTPS;这家会一直免费,也不会出需要收费的证书方案,所以可以放心。关于这家证书,可以访问他们的官网:letsencrypt.org 。

      1. 你的评论居然被 Akismet 自动标记为 Spam 了,好奇怪,我现在才看到。

        KeyCDN 支持 ECC 吗?目前 KeyCDN 自动签发的 Let’s Encrypt 证书是 RSA 的(从我做过的一个给 WordPress 的 KeyCDN 插件的 Demo 页面看出来的:https://keycdn.tlo.one ),双证书肯定是不支持,在后台只能配置一个证书。

    1. 现阶段 ECC 感觉还是可有可无的东西,带宽、CPU 消耗都不是什么问题。

      不过 ECC 证书的兼容性还是很可以的,免费版 CloudFlare 目前就只用了 ECC,官方说兼容性 99%,所以就算不配置 RSA 只配置 ECC 证书也没什么太大问题,基本上支持 SNI 的操作系统/浏览器都支持 ECC,所以没独立 IP 的可以直接考虑 ECC 了。

发表评论

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

评论可能需要审核才能显示,请尽量让自己的回复能够对别人有帮助

当有人回复你时你会收到邮件通知,你所回复的人能够看到你的电子邮件地址。