to be
a problem slover

使用acme.sh生成let’s encrypt泛域名证书

概述

acme.sh 实现了 acme 协议,可以从 let’s encrypt 生成免费的证书。

本文介绍如何使用 acme.sh 生成 let’s encrypt 泛域名 tls 证书。

安装 acme.sh

安装很简单,一个命令:

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

普通用户和 root 用户都可以安装使用.
安装过程进行了以下几步:

1). 把 acme.sh 安装到你的 home 目录下:

~/.acme.sh/

并创建 一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

2). 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议。

一般有两种方式验证: http 和 dns 验证。dns 验证又分手动和自动。

我建议使用 dns 自动验证的方式,方便快捷。

使用方法参考官方文档

支持主流的 dns 服务商,去 dns 服务商申请一个 apikey 即可使用。

我使用的是 dnspod,export apikey 之后,一键生成泛域名证书的命令为

acme.sh --issue --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'

后续手动强制更新加上 --force选项

acme.sh --issue --force --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'

域名注意要加单引号 ,否则因为有*通配符,可能会报错(我使用的是 zsh,报的错为zsh: no matches found: *.liushiming.com

查看证书

证书生成后在/.acme.sh/your_domain.com/目录中

安装证书

不要直接使用.acme.sh中的目录作为 nginx 的证书目录,因为这个目录只是acme内部使用的,而且在更新证书时,需要 reload nginx,也要指定 reload 命令

安装证书命令(将liushiming.cn替换成你的域名)

$ acme.sh --installcert -d liushiming.cn \
--key-file       /etc/nginx/ssl/liushiming.cn.key  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "systemctl force-reload nginx"

这命令的作用有两个

  • 将证书文件 copy 到你指定的 nginx 目录中
  • 设置证书文件更新时 nginx reload 命令

执行完命令后查看证书是否被放在指定目录

$ ls /etc/nginx/ssl/

nginx 配置

在 nginx 中配置 tls 证书
nginx/conf.d/wordpress.conf

server {
    listen 80;
    listen [::]:80;
    server_name liushiming.cn www.liushiming.cni 47.107.59.241;
    return 301 https://$server_name$request_uri;
    root /var/www/html/wordpress;
}

server {
    listen 443 ssl;
    server_name liushiming.cn www.liushiming.cn;

    ssl on;
    ssl_certificate      /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key  /etc/nginx/ssl/liushiming.cn.key;

    root /var/www/html/wordpress;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi-php.conf;
        # fastcgi_pass 127.0.0.1:9000;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

ssl_certificate 使用 fullchain.cer ,而非 .cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

证书自动更新

证书有效期为 90 天

每天 0:00 点自动检测所有的证书,如果快过期了,需要更新, 则会自动更新证书。

注意:自动更新证书只是更新了服务上的证书和密钥,如果使用了 cdn,还要手动更新 cdn 的证书,参见下面两节。

cdn 证书配置 – 七牛云

如果网站使用了 cdn,在 cdn 的提供商也需要配置 https,否则就不是全站 https 了,chrome 还是会提示不安全。

我的图片是保存在七牛云的,其他静态文件用阿里云 cdn 加速,所以七牛云/阿里云也需要配置 https 证书。

以七牛云为例 cdn 的 https 配置:

七牛云要求的证书格式是.pem格式的,而 acme 生成的证书是.cer后缀的,需要转换一下

cd ~/.acme.sh/your_domain.com
openssl x509 -in fullchain.cer -out qiniu_fullchain.pem -outform PEM
cat qiniu_fullchain.pem

将打印出来的证书复制贴到七牛云证书内容这栏

证书私钥是无需转换的,直接cat your_domain.com.key获得

证书上传后, 在ssl证书管理中就会出现新的证书了

点击部署cdn

cdn 证书配置 – 阿里云

以阿里云为例,新增或者证书续期时,都需要手动去阿里云更新证书,参见下图,先上传,再点部署:

验证 https

用 chrome 访问网站看到 https 的小锁就说明配置成功

参考资料

acme wiki
dnsapi 使用说明
Issue Wildcard certificate with zsh failed

Last Updated on

赞(1) 打赏
欢迎转载,注明出处:刘世明的博客 » 使用acme.sh生成let’s encrypt泛域名证书

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下作者

支付宝扫一扫打赏

微信扫一扫打赏