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 天
ZeroSSL 免费 CA官方只允许 90 天
acme.sh 是一个纯 Shell 写的 ACME 协议客户端,开源、轻量、无依赖,专门用来自动申请、续签、部署 HTTPS 证书(Let’s Encrypt、ZeroSSL、Buypass、Google Trust Services 等 CA 都支持),跑在 Linux / FreeBSD /macOS 上,Debian 非常适配。
https://github.com/acmesh-official/acme.sh
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