@xiaoyixy
2018-02-27T15:38:46.000000Z
字数 3170
阅读 9499
nginx
主要步骤:
只需要一个命令
curl https://get.acme.sh | sh
可能报错:
curl: (6) Couldn't resolve host 'get.acme.sh'...
1. 重试一次;
2. 检查网络,检查防火墙配置。
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
/// 停用 nginx, 配置 <domain>.com 默认端口为 80 并重启 Web 服务器
/// 否则直接执行可能报错:
/// <mydomain>.com:Verify error:Invalid response from http://<mydomain>.com/.well-known/acme-challenge/YEjFZyIKMWgLrcy614x6ePDzqjfcU_nS7TMpbN1dv24:
// 查看当前进程的 pid(如 2072 2074)
ps -ef|grep nginx
// 杀死进程 2072 2074
kill -9 2072 2074
/// 申请签发 SSL 证书
// 切换目录
cd /.acme.sh
// 运行签发命令
// 下面这段过程将会往 /home/wwwroot/mydomain.com/ 创建一个 .well-known 的文件夹,
// 同时 Let’ s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限,它可能会去访问
// http://mydomain.com/.well-known/ 这个路径。 所以需要确保/home/wwwroot/mydomain.com/
// 在 Nginx 上配置成 root 目录,里面任意文件可以直接域名访问的(由于通过 nginx 反向代理
// 后访问隐藏文件夹(.well-known)会得到 HTTP 4.3 Forbidden 的结果,故前面我选择先停用 nginx)
./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
/*
* 以上命令成功执行会得到类似以下的输出:
[Fri Oct 15 15:10:16 CST 2016] Renew: 'mydomain.com'
[Fri Oct 15 15:10:16 CST 2016] Single domain='mydomain.com'
[Fri Oct 15 15:10:16 CST 2016] Getting domain auth token for each domain
[Fri Oct 15 15:10:16 CST 2016] Getting webroot for domain='mydomain.com'
[Fri Oct 15 15:10:16 CST 2016] _w='/home/wwwroot/mydomain.com/'
[Fri Oct 15 15:10:16 CST 2016] Getting new-authz for domain='mydomain.com'
[Fri Oct 15 15:08:57 CST 2016] The new-authz request is ok.
[Fri Oct 15 15:08:57 CST 2016] Verifying:mydomain.com
[Fri Oct 15 15:09:01 CST 2016] Success
[Fri Oct 15 15:09:01 CST 2016] Verify finished, start to sign.
[Fri Oct 15 15:09:02 CST 2016] Cert success.
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
[Fri Oct 15 15:09:02 CST 2016] Your cert is in /root/.acme.sh/mydomain.com/www.your-app.com.cer
[Fri Oct 15 15:09:02 CST 2016] Your cert key is in /root/.acme.sh/mydomain.com/www.your-app.com.key
[Fri Oct 15 15:09:04 CST 2016] The intermediate CA cert is in /root/.acme.sh/mydomain.com/ca.cer
[Fri Oct 15 15:09:04 CST 2016] And the full chain certs is there: /root/.acme.sh/mydomain.com/fullchain.cer
*/
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方. 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。
/*
* 参考文章使用的是
* 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"
* 多了 \--reloadcmd "service nginx force-reload" 这一句
* 这里之所以不需要是因为我们把 nginx 关掉了,等全部配置好再启动就好了。
*/
acme.sh --installcert -d <domain>.com \--key-file /etc/nginx/ssl/<domain>.key \--fullchain-file /etc/nginx/ssl/fullchain.cer
/*
* 以上命令成功会得到类似如下输出
[Fri Oct 15 15:29:57 CST 2016] Installing key to:/etc/nginx/ssl/<domain>.key
[Fri Oct 15 15:29:57 CST 2016] Installing full chain to:/etc/nginx/ssl/<domain>.key.pem
*/
// 生成 dhparam.pem 文件
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
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;
server_name <mydomain>.com;
return 301 https://<mydomain>.com;
}
server {
# 新增
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/<domain>.key.pem;
ssl_certificate_key /etc/nginx/ssl/<domain>.key;
# ssl_dhparam
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
//...
}
}
/usr/local/nginx/sbin/nginx
/*
* Nginx 未安装 ssl 模块会报错,参考
* http://blog.csdn.net/w410589502/article/details/72833283
*/
参考文章:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E