Table of Contents
更新
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"
准备就绪开始申请证书,执行以下命令
/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
列出特定域名的信息
发表回复