[关闭]
@xiaoyixy 2018-02-27T07:38:46.000000Z 字数 3170 阅读 9000

nginx 使用 acme.sh 配置支持 HTTPS 访问

nginx


主要步骤:

安装 acme.sh

只需要一个命令
curl https://get.acme.sh | sh

可能报错:
curl: (6) Couldn't resolve host 'get.acme.sh'...
1. 重试一次;
2. 检查网络,检查防火墙配置。

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.

  1. /// 停用 nginx, 配置 <domain>.com 默认端口为 80 并重启 Web 服务器
  2. /// 否则直接执行可能报错:
  3. /// <mydomain>.com:Verify error:Invalid response from http://<mydomain>.com/.well-known/acme-challenge/YEjFZyIKMWgLrcy614x6ePDzqjfcU_nS7TMpbN1dv24:
  4. // 查看当前进程的 pid(如 2072 2074)
  5. ps -ef|grep nginx
  6. // 杀死进程 2072 2074
  7. kill -9 2072 2074
  8. /// 申请签发 SSL 证书
  9. // 切换目录
  10. cd /.acme.sh
  11. // 运行签发命令
  12. // 下面这段过程将会往 /home/wwwroot/mydomain.com/ 创建一个 .well-known 的文件夹,
  13. // 同时 Let’ s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限,它可能会去访问
  14. // http://mydomain.com/.well-known/ 这个路径。 所以需要确保/home/wwwroot/mydomain.com/
  15. // 在 Nginx 上配置成 root 目录,里面任意文件可以直接域名访问的(由于通过 nginx 反向代理
  16. // 后访问隐藏文件夹(.well-known)会得到 HTTP 4.3 Forbidden 的结果,故前面我选择先停用 nginx)
  17. ./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
  18. /*
  19. * 以上命令成功执行会得到类似以下的输出:
  20. [Fri Oct 15 15:10:16 CST 2016] Renew: 'mydomain.com'
  21. [Fri Oct 15 15:10:16 CST 2016] Single domain='mydomain.com'
  22. [Fri Oct 15 15:10:16 CST 2016] Getting domain auth token for each domain
  23. [Fri Oct 15 15:10:16 CST 2016] Getting webroot for domain='mydomain.com'
  24. [Fri Oct 15 15:10:16 CST 2016] _w='/home/wwwroot/mydomain.com/'
  25. [Fri Oct 15 15:10:16 CST 2016] Getting new-authz for domain='mydomain.com'
  26. [Fri Oct 15 15:08:57 CST 2016] The new-authz request is ok.
  27. [Fri Oct 15 15:08:57 CST 2016] Verifying:mydomain.com
  28. [Fri Oct 15 15:09:01 CST 2016] Success
  29. [Fri Oct 15 15:09:01 CST 2016] Verify finished, start to sign.
  30. [Fri Oct 15 15:09:02 CST 2016] Cert success.
  31. -----BEGIN CERTIFICATE-----
  32. ...
  33. -----END CERTIFICATE-----
  34. [Fri Oct 15 15:09:02 CST 2016] Your cert is in /root/.acme.sh/mydomain.com/www.your-app.com.cer
  35. [Fri Oct 15 15:09:02 CST 2016] Your cert key is in /root/.acme.sh/mydomain.com/www.your-app.com.key
  36. [Fri Oct 15 15:09:04 CST 2016] The intermediate CA cert is in /root/.acme.sh/mydomain.com/ca.cer
  37. [Fri Oct 15 15:09:04 CST 2016] And the full chain certs is there: /root/.acme.sh/mydomain.com/fullchain.cer
  38. */
copy 证书到 nginx 或者其他服务

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方. 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。

  1. /*
  2. * 参考文章使用的是
  3. * acme.sh --installcert -d <domain>.com \--key-file /etc/nginx/ssl/<domain>.key \--fullchain-file /etc/nginx/ssl/fullchain.cer \--reloadcmd "service nginx force-reload"
  4. * 多了 \--reloadcmd "service nginx force-reload" 这一句
  5. * 这里之所以不需要是因为我们把 nginx 关掉了,等全部配置好再启动就好了。
  6. */
  7. acme.sh --installcert -d <domain>.com \--key-file /etc/nginx/ssl/<domain>.key \--fullchain-file /etc/nginx/ssl/fullchain.cer
  8. /*
  9. * 以上命令成功会得到类似如下输出
  10. [Fri Oct 15 15:29:57 CST 2016] Installing key to:/etc/nginx/ssl/<domain>.key
  11. [Fri Oct 15 15:29:57 CST 2016] Installing full chain to:/etc/nginx/ssl/<domain>.key.pem
  12. */
  13. // 生成 dhparam.pem 文件
  14. openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
配置 Nginx
  1. http {
  2. # 新增
  3. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  4. ssl_prefer_server_ciphers on;
  5. # 兼容其他老浏览器的 ssl_ciphers 设置请访问 https://wiki.mozilla.org/Security/Server_Side_TLS
  6. server {
  7. listen 80;
  8. server_name <mydomain>.com;
  9. return 301 https://<mydomain>.com;
  10. }
  11. server {
  12. # 新增
  13. listen 443 ssl;
  14. ssl_certificate /etc/nginx/ssl/<domain>.key.pem;
  15. ssl_certificate_key /etc/nginx/ssl/<domain>.key;
  16. # ssl_dhparam
  17. ssl_dhparam /etc/nginx/ssl/dhparam.pem;
  18. //...
  19. }
  20. }
重启 Nginx
  1. /usr/local/nginx/sbin/nginx
  2. /*
  3. * Nginx 未安装 ssl 模块会报错,参考
  4. * http://blog.csdn.net/w410589502/article/details/72833283
  5. */

参考文章:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注