群晖DSM下套件及系统网页服务器ssl证书自动更新

关键字: DSM ssl 证书

起因

群晖下自建服务(alist3)和系统服务在外部网络访问需要加ssl安全证书来实现基础的传输保护。

申请证书和续期手动操作都还好,不算太麻烦,但是每个应用单独证书需要复制和重启,再配合服务重启一套下来就比较麻烦了,于是有了这篇文章和末尾的ssl自动续期和证书自动复制及服务自动重启脚本

方案

免费ssl证书的申请,一般是let's encrypt 或者 Trust Asia ,泛域名三个月续期。手动操作比较繁琐,且三个月操作一次更加的繁琐。

自动化ssl续期/申请工具有:

  • acme.sh (基于linux原生shell,不需要额外的安装其他东西,但是可能一些非常规linux 系统下会有问题,比如群晖内linux)
  • certbot (基于python,可以用acme代理认证或者直接域名服务商dns更新,大部分云厂商都有插件支持)
  • keyManager (Windows下,可以自动部署到服务器)
  • ......

本来打算直接用acme.sh,但是不知道为什么我这边群晖下(ssh 登录群晖终端) acme.sh 总是openssl报错,懒得去动系统内的依赖(openssl动了可能影响很多东西),搜了下发现certbot也完整实现了acme协议,基于python实现的。

安装 certbot(直接pip 安装就行) 以及 ssl续期 网上有很多教程,就不详细介绍了,脚本中域名和路径、accesskey等自行更改。

bash 复制代码
# ssh
ssh 192.168.1.100

# root权限
sudo su -


# 插件按需安装就行
pip3 install certbot certbot-dns-aliyun certbot-dns-cloudflare certbot-auth-dnspod


# 这里用阿里云演示
### 配置文件
mkdir -p /etc/letsencrypt/

cat > /etc/letsencrypt/credentials.ini <<EOF
dns_aliyun_access_key = 12345678
dns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef
EOF

chmod 644 /etc/letsencrypt/credentials.ini


# 申请命令
certbot certonly \
--authenticator=dns-aliyun \
--dns-aliyun-credentials=' /etc/letsencrypt/credentials.ini' \
-d example.com\
-d "*.example.com"



# 手动续期
cerbot renew -q

流程及脚本

这里来讲一下本文的主要目的:

  1. 自动续期脚本

  2. 复制证书并重启alist

  3. 复制证书并重启 nginx

具体路径自己更改

bash 复制代码
#! /bin/bash

is_updated="false"

check_file_md5_and_replace(){
    file1="$1"
    file2="$2"

    # 检查文件是否存在
    if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then
        echo "Error: Both files must exist."
        return 1
    fi

    # 计算文件的MD5摘要
    md5_file1=$(md5sum "$file1" | awk '{print $1}')
    md5_file2=$(md5sum "$file2" | awk '{print $1}')

    # 比较MD5摘要
    if [ "$md5_file1" != "$md5_file2" ]; then
        echo "MD5 mismatch. Copying $file1 to $file2."
        cp "$file1" "$file2"
        is_updated="true"
        echo "Copy complete."
    else
        echo "MD5 match. No action needed."
    fi
}

# 需要续期的域名,自行修改
domain=example.com

ssl_cert=/etc/letsencrypt/live/${domain}/cert.pem
ssl_chain=/etc/letsencrypt/live/${domain}/chain.pem
ssl_fullchain=/etc/letsencrypt/live/${domain}/fullchain.pem
ssl_privkey=/etc/letsencrypt/live/${domain}/privkey.pem


# renew ssl certs
/usr/bin/certbot renew -q

# update alist3 certs
target_ssl_fullchain=/volume1/@appdata/alist3/cert.crt
target_ssl_privkey=/volume1/@appdata/alist3/pri.key
check_file_md5_and_replace ${ssl_fullchain} ${target_ssl_fullchain}
if [ "$is_updated" = "true" ]; then
    synopkg restart alist3
    is_updated="false" 
fi 
check_file_md5_and_replace ${ssl_privkey} ${target_ssl_privkey}


# update syno default certs
target_path=/usr/syno/etc/certificate/_archive/VpBstU
target_ssl_cert=${target_path}/cert.pem
target_ssl_chain=${target_path}/chain.pem
target_ssl_fullchain=${target_path}/fullchain.pem
target_ssl_privkey=${target_path}/privkey.pem

check_file_md5_and_replace ${ssl_cert} ${target_ssl_cert}
if [ "$is_updated" = "true" ]; then
    systemctl restart nginx
fi 
check_file_md5_and_replace ${ssl_chain} ${target_ssl_chain}
check_file_md5_and_replace ${ssl_fullchain} ${target_ssl_fullchain}
check_file_md5_and_replace ${ssl_privkey} ${target_ssl_privkey}


# 查看证书信息
# openssl x509 -in VpBstU/fullchain.pem -text -noout|grep DNS

群晖下套件采用 synopkg 管理

系统服务使用 systemctl 管理

参考来源

使用 Certbot 自动申请并续订阿里云 DNS 免费泛域名证书_tabsp的博客-CSDN博客

Certbot免费证书的安装·使用·自动续期_certbot renew_BlackRockZero的博客-CSDN博客

查看 PEM DER 格式证书命令_centos查看pem证书命令_maimang09的博客-CSDN博客

相关推荐
小宋10212 分钟前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq
m0_609000425 分钟前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
小安运维日记1 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
kejijianwen2 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
m0_741768855 小时前
使用docker的小例子
运维·docker·容器
学习3人组5 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神5 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0666 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen016 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦6 小时前
linux 解压缩
linux·运维·服务器