acme.sh + Let's Encrypt + nginx
环境说明
- 域名为万网注册域名
- 服务器Ubuntu 16.04
通过acme.sh方式获取证书
- 获取acme.sh
curl https://get.acme.sh | sh
acme.sh
- 如果acme.sh 命令未找到
source ~/.bashrc
# zsh 下
source ~/.zshrc
-
申请签发 SSL 证书
acme.sh强大之处在于,可以自动配置DNS,不用去域名后台操作解析记录了。下面以万网域名的操作为例# 替换成从阿里云后台获取的密钥 export Ali_Key="xxx" export Ali_Secret="xxxxxxxx" # 换成自己的域名 acme.sh --issue --dns dns_ali -d xxx.com -d *.xxx.com
获取Ali_Key 和 Ali_Secret的方法
其他地方注册的请参考这里
如果在zsh环境下报 zsh: no matches found: *.xxx.com 的错误vim ~/.zshrc # 在文件上追加 setopt no_nomatch source ~/.zshrc
证书申请成功之后会出现如下的信息
[Mon Apr 30 15:35:14 CST 2018] Your cert is in /root/.acme.sh/xxx.com/xxx.com.cer [Mon Apr 30 15:35:14 CST 2018] Your cert key is in /root/.acme.sh/xxx.com/xxx.com.key [Mon Apr 30 15:35:14 CST 2018] The intermediate CA cert is in /root/.acme.sh/xxx.com/ca.cer [Mon Apr 30 15:35:14 CST 2018] And the full chain certs is there: /root/.acme.sh/xxx.com/fullchain.cer
申请的证书会放到 ~/.acme.sh/ 目录里面,所有的 acme.sh 配置都记录在 ~/.acme.sh/ 目录里面,acme.sh 有自动的配置读取,并按域名划分,下次你再次执行的时候,它知道你之前是用的那个目录,只需要告诉它域名就好了。
-
安装证书
acme.sh --installcert -d xxx.com \ --keypath /data/nginx/ssl/xxx.com.key \ --fullchainpath /data/nginx/ssl/xxx.com.key.pem \ --reloadcmd "/data/nginx/sbin/nginx -s reload" # /data/nginx/ssl/ 是证书安装目录 # reloadcmd 是nginx 的reload 命令
这个比较重要,因为它会让 acme.sh 记住重启 Nginx 的命令,以后自动更新证书的动作需要重启 Nginx,然后你会看到结果
[Mon Apr 30 16:19:32 CST 2018] Installing key to:/data/nginx/ssl/xxx.com.key [Mon Apr 30 16:19:32 CST 2018] Installing full chain to:/data/nginx/ssl/xxx.com.key.pem [Mon Apr 30 16:19:32 CST 2018] Run reload cmd: /data/nginx/sbin/nginx -s reload [Mon Apr 30 16:19:32 CST 2018] Reload success
-
配置nginx
生成 dhparam.pem 文件openssl dhparam -out /data/nginx/ssl/dhparam.pem 2048
修改 Nginx 启用 SSL
http { # 新增 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # 兼容其他老浏览器的 ssl_ciphers 设置请访问 https://wiki.mozilla.org/Security/Server_Side_TLS server { listen 80 default_server; # 新增 listen 443 ssl; ssl_certificate /data/nginx/ssl/www.xxx.com.key.pem; ssl_certificate_key /data/nginx/ssl/www.xxx.com.key; # ssl_dhparam ssl_dhparam /data/nginx/ssl/dhparam.pem; # 其他省略 } }
检查 Nginx 配置是否正确后重启
/data/nginx/sbin/nginx -t # 检查无误后,重启nginx /data/nginx/sbin/nginx -s reload
-
验证 SSL
访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
https://ssllabs.com/ssltest/analyze.html?d=xxx.com
确保验证结果有 A 以上,否则根据提示调整问题
-
一些注意事项
ssl_dhparam
未配置,将导致 ssllabs.com 的评分降到 B,并给This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B.
的警告。
ssl_prefer_server_ciphers on
也是一个必要的配置,否则会 A+ 变成 A-;*
如果你需要兼容老系统或老浏览器的话,你需要配置ssl_ciphers
,详见 Mozilla Server_Side_TLS 的介绍,Nginx 里面ssl_ciphers
默认值是HIGH:!aNULL:!MD5;
ref -
参考
https://github.com/Neilpang/acme.sh
https://my.oschina.net/kimver/blog/1634575
https://ruby-china.org/topics/31983