主要步骤:

安装 acme.sh
生成证书
copy 证书到 nginx 或者其他服务
Nginx 配置
重启 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 验证.

/// 停用 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 证书到 nginx 或者其他服务
前面证书生成以后, 接下来需要把证书 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

配置 Nginx

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;
        //...
    }
}

重启 Nginx

/usr/local/nginx/sbin/nginx

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