Nginx 配置:证书
获取你的证书,加密你的流量,走上人生巅峰
Let’s Encrypt 作为最受欢迎的的免费证书发放 CA,是个人网站证书的不二选择。通过使用 acme.sh 等脚本可以实现证书的自动续期,当然域名权限的验证是可信 CA 必须要做好的工作。
2021.9 更新:
acme.sh 在 3.0 版本之后更换了默认证书注册机构:
目前新申请的证书为 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 | export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" |
然后执行下面命令即可生成证书:
1 | acme.sh --issue --dns dns_cf -d example.com -d www.example.com |
执行之后 CF_Key
和 CF_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 | acme.sh --install-cert -d example.com \ |
使用 service nginx force-reload
可以使证书进行自动续期后及时更新 Nginx 读取的配置
nginx 设置
1 | ssl_certificate /path/to/my/public.cer; |
Cloudflare 设置
如果需要套一层 Cloudflare,需要做客户端验证来防止绕过回源
即,只接受来自 Cloudflare 的请求
申请源证书
Cloudflare 可以给你发一个 15 年有效的证书(是个假的,相当于自签名)
源服务器拉取验证身份
1 | ssl_client_certificate /path/to/cloudflare.crt; |