ssl证书是必不可少的, 腾讯云申请证书麻烦, 不能使用泛域名, 也不能自动续签, 而acme.sh脚本则能解决这些问题.
大家普遍使用两种方法来安装, 一种是直接在主机上安装, 另一种是使用acme的docker安装, 我发现这两种方法都不好, 于是自创了一种nginx镜像里面集成acme脚本, 我觉得这种方法好.
我使用的是腾讯云, 所以下面贴上配置, 然后慢慢解释下:
Nginx的Docker配置
FROM nginx:1.21.1
#设置本地时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
#统一主机和容器管理者
RUN groupmod -g <GID> www-data \
&& usermod -u <GID> -g <GID> www-data
# 安装crontab等软件
RUN echo "Acquire::http::Proxy \"<代理>\";" > /etc/apt/apt.conf \
&& apt-get update \
&& apt-get install -y cron openssl socat procps \
&& rm -rf /var/lib/apt/lists/*
# 设置代理并下载acme脚本 然后设置自动更新
RUN export http_proxy="<代理>" \
&& export https_proxy="<代理>" \
&& curl https://get.acme.sh | sh
#################
# 注册帐号
RUN ~/.acme.sh/acme.sh --register-account -m <邮箱帐号>
# 设置DNSPod帐号密码,使用DNS验证生成证书
RUN export DP_Id="<DP_Id>" \
&& export DP_Key="<DP_Key>" \
&& ~/.acme.sh/acme.sh --issue \
--dns dns_dp \
-d dzketang.com \
-d '*.dzketang.com' \
-d dunfu.top \
-d '*.dunfu.top'
# 刷新
ENV REFRESH_TIME 20230424
# 添加安装证书脚本
ADD ./docker/nginx/reload.sh /root/reload.sh
# 创建证书文件夹并安装证书
RUN mkdir -p /var/www/certificate \
&& chmod +x /root/reload.sh \
&& ~/.acme.sh/acme.sh --install-cert -d dzketang.com \
--key-file /var/www/certificate/certificate.key \
--fullchain-file /var/www/certificate/certificate.crt \
--reloadcmd /root/reload.sh
# 设置acme脚本自动更新
RUN ~/.acme.sh/acme.sh --upgrade --auto-upgrade
Nginx的Docker配置解释
如果是国内服务器必须要使用代理, 否则根本安装不了.
issue多域名泛域名生成的证书只有一张(这个是重点), 以上4个域名是共用一张证书的, acme作者说了, --install-cert命令只会记录最后一个, 如果不是共用一张证书, 就要多次执行--install-cert命令, 脚本只会记录最后一个--install-cert命令, 那么根本不能实现自动续签, 所以四个域名共用一张证书很合理.
共用的证书会生成到第一个issue的域名下, 所以我在执行--install-cert时, -d后面的参数是第一个域名.
我没有创建acme.sh别名, 所以每次执行命令时要使用全路径
~/.acme.sh/acme.sh
使用issue生成证书时, 会出现curl的错误, 我估计是curl原装版本太低, curl的证书不支持, 解决方法应该是安装curl的高版本, 或则curl使用时禁用检查. 暂时看上去没什么影响就没管, 知道的兄弟说一下如何解决.
必须使用脚本重启, 在nginx没启动时使用启动命令, 在nginx启动后使用重载命令.
使用泛域名前必须要先使用主域名, 不能直接使用泛域名.
泛域名验证必须使用DNS验证
reload脚本
#! /bin/bash
nginx_procnum=`ps -ef|grep "nginx"|grep -v grep|wc -l`
if [ $nginx_procnum -eq 0 ]
then
echo "start nginx..."
/etc/init.d/nginx start
else
echo "reload nginx"
nginx -s reload
fi
参考资料
docker-compose + acme.sh + nginx 签署 ssl 证书