Noname
Noname

用 acme.sh 申请 ZeroSSL 通配符证书/自动续期

更新

20221116:鉴于现在 acme.sh 默认的 CA 是 ZeroSSL,所以本文也做一些对应的修改。
如果因为某些原因想换回原来的 Let’s Encrypt CA,请使用以下命令
acme.sh --set-default-ca --server letsencrypt
另外,以前安装的 acme.sh 依然会使用 Let’s Encrypt CA 签发,如果想切换到 ZeroSSL,请使用以下命令,记得修改邮箱地址以便自动注册 ZeroSSL 账号

acme.sh --register-account -m [email protected] --server zerossl
acme.sh --set-default-ca --server zerossl

之后重新续签所有已有的证书即可切换


20211216:由于 cloudflare 不再支持使用 dns api 来更新免费域名(如.ml/.gq/.ga等)的解析记录,所以使用 acme.sh 的 DNS 别名模式来解决,但需要自己拥有另一个付费域名(如.net/.com等)

正文

这次博客服务器迁移,需要重新申请证书。由于有很多子域名,所以干脆申请一个通配符证书,这样一来所有子域名的站点都可以使用一份证书,不需要为每一个子域名单独申请了。

本例将在 centos7 系统下使用 acme.sh 来申请 ZeroSSL 的免费证书,证书的有效期为90天,但是可以配合DNS服务提供商的API实现自动续期,web server 为 nginx,域名托管在 cloudflare

首先下载安装脚本并运行,安装脚本会自动安装并配置好定时任务

wget https://get.acme.sh -O install_acme.sh
chmod +x install_acme.sh
./install_acme.sh [email protected]

请修改上面 [email protected] 为自己的邮箱地址,会使用此邮箱地址自动注册 ZeroSSL 账户
后续可以登录 ZeroSSL 官网管理和查看已签发的证书


设置好环境变量,这个是acme.sh调用cloudflare(下称cf)的api时使用的用户名和key

export CF_Email="[email protected]"
export CF_Key="your cloudflare Key"

用户名就是登陆cf的用户名,key的获取参照下图

https://blog.cpmsxe.net/wp-content/uploads/2019/12/63d3826ba2b21d5f8756d0c770a7e127.png


准备就绪开始申请证书,执行以下命令

/root/.acme.sh/acme.sh --issue -d hakuren.ml -d *.hakuren.ml --dns dns_cf

注:如果你跟博主一样使用的是freenom的免费域名,由于cf的限制,上面的命令会出错,可以使用DNS别名的方式来完成验证,步骤如下:
还是以hakuren.ml这个域名为例子,先添加一个CNAME记录,名称为
_acme-challenge
目标为
_acme-challenge.mydomain.net
其中mydomain.net为自己的另一个付费域名,此域名必须托管在cf下,即由cf来解析,这样才可以使用cf的dns api
然后回到服务器执行以下命令签发证书
/root/.acme.sh/acme.sh --issue -d hakuren.ml -d *.hakuren.ml --dns dns_cf --challenge-alias mydomain.net

注意一定要单独加入根域名本身,因为*.hakuren.ml是不包含hakuren.ml的。申请泛域名证书只能使用DNS验证方式,并且如果需要自动续期的话,必须使用域名服务提供商的API自动添加txt记录用于验证。想手动完成验证的话,去掉dns_cf参数,然后按照提示进行。
附:acme.sh内置了很多域名服务提供商的API脚本,如果域名托管在其他服务商的话,请参照这里

acme.sh会生成私钥和CSR,并自动配置DNS添加txt记录验证域名所有权,完事之后会自动删除txt记录,此过程可能需要数分钟。如果一切正常没有报错的话,证书就会签发下来,可以进行下一步
准备一个文件夹用来存放安装的证书和私钥

mkdir /usr/local/nginx/conf/ssl/hakuren.ml

修改对应站点的nginx配置文件(下面是一个范例)

server
    {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name blog.cpmsxe.net ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/blog;
        ssl on;
        #指定证书和私钥的路径,证书最好使用fullchain以防有些操作系统或浏览器没有内置 ZeroSSL 的根证书
        ssl_certificate /usr/local/nginx/conf/ssl/hakuren.ml/fullchain.pem;
        ssl_certificate_key /usr/local/nginx/conf/ssl/hakuren.ml/private.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        #ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
        #可选,设置HSTS头,让浏览器只允许https访问
        add_header Strict-Transport-Security "max-age=31536000" always;
    }

接下来安装证书和私钥

/root/.acme.sh/acme.sh --install-cert -d hakuren.ml \
--cert-file      /usr/local/nginx/conf/ssl/hakuren.ml/cert.pem  \
--key-file       /usr/local/nginx/conf/ssl/hakuren.ml/private.key  \
--fullchain-file /usr/local/nginx/conf/ssl/hakuren.ml/fullchain.pem \
--reloadcmd   "/usr/local/nginx/sbin/nginx -s reload"

--reloadcmd为这次以及以后自动安装完证书后执行的重启命令,这里是让nginx重载配置以便让更新的证书生效

检查一下证书和私钥是否拷贝到指定的位置

ll /usr/local/nginx/conf/ssl/hakuren.ml

至此配置完成,可以访问一下站点看看有没有问题

附录:一些 acme.sh 命令

acme.sh --list列出所有已签发证书信息
acme.sh --info -d mydomain.net列出特定域名的信息

没有标签
首页      Linux      用 acme.sh 申请 ZeroSSL 通配符证书/自动续期

发表回复

textsms
account_circle
email

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

Noname

用 acme.sh 申请 ZeroSSL 通配符证书/自动续期
更新 20221116:鉴于现在 acme.sh 默认的 CA 是 ZeroSSL,所以本文也做一些对应的修改。 如果因为某些原因想换回原来的 Let’s Encrypt CA,请使用以下命令 acme.sh --set-default-ca --s…
扫描二维码继续阅读
2019-12-26