使用 acme.sh 自动生成免费 https 证书

2020-09-06
tool
7860

Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。适用于个人网站等小站点。

Let's Encrypt 证书有效期为90天,过期需要重新申请,手动操作会比较麻烦。acme.sh 就解决了这些麻烦,它提供了快速生成证书,同时定时刷新证书功能。这里介绍一下具体的使用流程:

安装

curl https://get.acme.sh | sh

生成证书

http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.

acme.sh  --issue  -d mydomain.com --webroot  /home/wwwroot/mydomain.com/

如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue  -d mydomain.com   --nginx

注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧.

copy/安装 证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方. 注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化. 正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

acme.sh --install-cert -d mydomain.com \
--key-file       /path/to/keyfile/in/nginx/mydomain.com.key.pem  \
--fullchain-file /path/to/fullcha/in/nginx/mydomain.com.cert.pem \
--reloadcmd     "nginx -s reload"

更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

Nginx 配置

server {
            listen 443;
            server_name mydomain.com;
            ssl on;
            ssl_certificate   /path/to/fullcha/in/nginx/mydomain.com.cert.pem;
            ssl_certificate_key  /path/to/keyfile/in/nginx/mydomain.com.key.pem;
            ssl_session_timeout 5m;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
            ssl_prefer_server_ciphers on;

            location / {
                proxy_pass http://localhost:3000;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host:$server_port;
            }

}

参考文档:

acme.sh官方文档