Nginx 配置:证书

获取你的证书,加密你的流量,走上人生巅峰

Let’s Encrypt 作为最受欢迎的的免费证书发放 CA,是个人网站证书的不二选择。通过使用 acme.sh 等脚本可以实现证书的自动续期,当然域名权限的验证是可信 CA 必须要做好的工作。

2021.9 更新:

acme.sh 在 3.0 版本之后更换了默认证书注册机构:

Change default CA to ZeroSSL

目前新申请的证书为 ZeroSSL 颁发,老证书续期无影响。

acme.sh 自动获取证书

An ACME Shell script: acme.sh - GitHub

首先一键安装:

1
curl  https://get.acme.sh | sh

安装会自动完成 3 个部分:

  • 安装到 ~/.acme.sh/
  • 创建一个 alias,acme.sh
  • 自动创建 crontab,每天 0 点检查所有证书,自动续期

acme 申请

设置好 DNS ,把域名挂在某目录上,acme 会自动生成验证文件,验证成功即下发证书

1
acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

但是大多数应用场景并不会公开域名下的文件,这时候就需要用到动态DNS验证。

动态 DNS 验证

acme.sh 支持通过域名服务商提供的 DNS API 来自动添加 DNS TXT 记录来验证,本文以 Cloudflare 为例,更多用法请查看文档 dnsapi

在 Cloudflare 个人资料页 API 管理面板 My Profile | Cloudflare 选择生成 API Key

1
2
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"

然后执行下面命令即可生成证书:

1
acme.sh --issue --dns dns_cf -d example.com -d www.example.com

执行之后 CF_KeyCF_Email 会被保存到 ~/.acme.sh/account.conf 以供下次执行使用

使用 ECC 证书

基于 ECDSA(椭圆曲线数字签名算法)的 ECC 证书提供了较传统 RSA 更好的安全解决方案,以更短的公钥长度提供更安全的加密强度和更好的性能。

256 bit 的 ECDSA 加密强度相当于 3072 bit RSA,可以大概认为 Key 越短性能越高…

在 acme.sh 中申请 ECC 只需要加上 --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.)

这里推荐选择 secp384r1,使用动态 DNS 验证申请 ECC 证书:

1
acme.sh --issue --dns dns_cf -d example.com --keylength ec-384

acme 安装证书

Nginx 需要 fullchain 证书

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/my/private.key \
--fullchain-file /path/to/my/public.cer \
--reloadcmd "service nginx force-reload"

使用 service nginx force-reload 可以使证书进行自动续期后及时更新 Nginx 读取的配置

nginx 设置

1
2
ssl_certificate /path/to/my/public.cer;
ssl_certificate_key /path/to/my/private.key;

Cloudflare 设置

如果需要套一层 Cloudflare,需要做客户端验证来防止绕过回源

即,只接受来自 Cloudflare 的请求

申请源证书

Cloudflare 可以给你发一个 15 年有效的证书(是个假的,相当于自签名)

源服务器拉取验证身份

Authenticated Origin Pulls

1
2
ssl_client_certificate /path/to/cloudflare.crt;    
ssl_verify_client on;

其他配置参考

Nginx 正确安装姿势

Nginx 配置:业务部分

Nginx 配置:证书

Nginx 配置:基于 SNI 的分流

Nginx 配置:安全