SSL自签证书

自签证书(OpenSSL),有效期365 天,脚本 + cron 每年自动重生成更新证书

创建证书存放目录

mkdir -p /nginx/ssl

写生成证书脚本 /nginx/ssl/zzsd.xxx.com.sh

#!/bin/bash
DOMAIN="zzsd.xxx.com"
CERTDIR="/nginx/ssl"
DAYS=365

# 生成365天SAN证书
openssl req -x509 -newkey rsa:4096 -noenc -days ${DAYS} \
-keyout ${CERTDIR}/${DOMAIN}.key -out ${CERTDIR}/${DOMAIN}.crt -sha256 \
-subj "/C=CN/O=Local/CN=${DOMAIN}" \
-addext "subjectAltName=DNS:${DOMAIN},DNS:localhost,IP:127.0.0.1"

# 权限
chmod 600 ${CERTDIR}/${DOMAIN}.key
chmod 644 ${CERTDIR}/${DOMAIN}.crt
# 重载Nginx(如果你不是nginx,改成你的服务,如haproxy reload)
systemctl reload nginx

授权执行:

chmod +x /nginx/ssl/zzsd.xxx.com.sh

设置 cron,每年自动重新签发(每年同一天执行)

crontab -e
#添加一行(示例:每年 2 月 1 日凌晨 3 点重建证书,你可以改日期)
0 3 1 2 * /nginx/ssl/zzsd.xxx.com.sh >> /nginx/ssl/zzsd.xxx.com.log 2>&1

Nginx 配置片段

server {
    listen 443 ssl;
    server_name zzsd.xxx.com;

    ssl_certificate     /nginx/ssl/zzsd.xxx.com.crt;
    ssl_certificate_key /nginx/ssl/zzsd.xxx.com.key;
}

公网免费证书:

Let’s Encrypt 免费 CA官方只允许 90 天

https://letsencrypt.org/open in new window

ZeroSSL 免费 CA官方只允许 90 天

https://zerossl.com/open in new window

acme.sh 是一个纯 Shell 写的 ACME 协议客户端,开源、轻量、无依赖,专门用来自动申请、续签、部署 HTTPS 证书(Let’s Encrypt、ZeroSSL、Buypass、Google Trust Services 等 CA 都支持),跑在 Linux / FreeBSD /macOS 上,Debian 非常适配。

https://github.com/acmesh-official/acme.shopen in new window

acme.sh配置自动续期:

安装步骤

服务器位于中国大陆境内, 访问 github 可能会不成功. 所以安装可能会失败,官方推荐gitee

首先安装git

#debian
apt install git
#centos
dnf install git

克隆仓库

#克隆仓库
git clone https://gitee.com/neilpang/acme.sh.git
#进入目录
cd acme.sh
#安装
./acme.sh --install -m xxx@mail.com
# 加载环境
source ~/.bashrc

验证是否装好

acme.sh --version

自动添加 cron 定时任务

# 查看定时任务
crontab -l

申请证书

# -d 指定域名
acme.sh --issue -d xxx.com -d www.xxx.com \
--webroot /xxx/www/html \
--server zerossl

#--webroot 会在网站根目录下自动创建临时验证文件
#--server zerossl 指定 CA 服务商为 ZeroSSL

申请成功后执行

acme.sh --install-cert -d xxx.com \
--key-file       /etc/nginx/ssl/xxx.key  \
--fullchain-file /etc/nginx/ssl/xxx.cer \
--reloadcmd     "systemctl reload nginx"

#把证书指定复制到 nginx 目录、设置重载命令,以后自动续期后自动重载 nginx

nginx配置

server {
    listen 443 ssl;
    server_name  xxx.com www.xxx.com;
    ssl_certificate      /etc/nginx/ssl/xxx.cer;
    ssl_certificate_key  /etc/nginx/ssl/xxx.key;
    
    # 推荐ssl参数
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    charset utf-8;
    location / {
        root /xxx/www/html;
        index index.html index.htm;
        charset utf-8;
	} 

    error_page  404 403 500 502 503 504  /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }   
}
server {
    listen 80;
    server_name xxx.com www.xxx.com;
        
    # 设置HTTP请求自动跳转到HTTPS
    return 301 https://$host$request_uri;

}

常用命令汇总

# 手动测试续期(不会强制续,只有快到期才更新)
acme.sh --renew -d zzsd.suecyl.hk

# 强制重新签发证书(调试用)
acme.sh --renew -d zzsd.suecyl.hk --force

# 列出所有已申请证书
acme.sh --list

# 查看证书信息、到期时间
acme.sh --info -d zzsd.suecyl.hk

# 升级acme.sh本身
acme.sh --upgrade

# 关闭自动升级
acme.sh --upgrade --auto-upgrade 0