有很多小伙伴在搭建网站后,不知道如何申请与配置SSL证书,甚至不清楚有免费90天使用的选择。我通过个人摸索结合自己的网站,分享几种基于Nginx的免费SSL证书配置过程。
主要有Certbot+ Nginx 插件、acme.sh+ Nginx 插件、Nginx Proxy Manger(npm)三种主流方案。主要以RHEL体系为主的体系来说,对于Certbot则又会细分为dnf、Sanp、pip三种不同的细分安装方式。
这几种方式我个人全部都操作实践中,操作过程远比列写的更加复杂,因为版本兼容、权限等各种问题,总有不尽完美的地方,最终选用Nginx Proxy Manger(npm)完美部署了SSL证书。
一、Certbot (dnf)+ Nginx 插件

RHEL/CentOS/Rocky Linux/AlmaLinux 等系统的默认 DNF 仓库没有 Certbot 安装包,需要先安装 EPEL 扩展源(免费开源软件仓库),就能找到包了!
1. 安装 EPEL 扩展源(核心步骤)
sudo dnf install-y epel-release
2. 刷新仓库缓存
sudo dnf makecache
3. 重新安装 Certbot + Nginx 插件
sudo dnf install-y certbot python3-certbot-nginx
4. 一键申请 HTTPS 证书(自动配置 Nginx)
sudo certbot --nginx-d 你的域名.com -d www.你的域名.com
按照提示输入邮箱、同意协议即可,全程自动完成:
自动申请证书
自动修改 Nginx 配置
自动开启 HTTP → HTTPS 强制跳转
自动配置证书续期(90 天自动续期,无需手动操作)
5. 验证自动续期(可选)
sudo certbot renew --dry-run
显示 Success 就代表续期正常。
6.Nginx 配置(自动方式,可选)
编辑配置文件(如 /etc/nginx/conf.d/yourdomain.conf):
# 1. HTTP 80 强制跳转到 HTTPS
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
# 2. HTTPS 443 主配置
server {
listen 443 ssl http2; # 开启 HTTP/2(性能更好)
server_name yourdomain.com www.yourdomain.com;
# ---------- 证书路径(替换为你的) ----------
ssl_certificate /etc/nginx/ssl/yourdomain.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.key;
# ---------- SSL 安全加固(必配) ----------
ssl_protocols TLSv1.2 TLSv1.3; # 禁用 TLS1.0/1.1
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS(首次先设 max-age=60 测试,无误后改 31536000)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 安全响应头
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
# ---------- 网站根目录/反向代理 ----------
root /usr/share/nginx/html;
index index.html;
# 反向代理示例(按需开启)
# location / {
# proxy_pass http://127.0.0.1:8080;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# }
}7.检查配置语法
nginx -t
重启 Nginx
# 显示 success 再下一步
systemctl restart nginx
8. 验证成功
浏览器访问 https://你的域名,地址栏出现 锁形图标 就搞定了!
总结
RHEL 系系统装 Certbot 必须先装
epel-release扩展源;安装后直接用
certbot --nginx一键配置 HTTPS;证书自动续期,无需后期维护。
二、Certbot (Snap)+ Nginx 插件
官方 DNF 仓库里的 Certbot 包已经被移除了,必须用官方推荐的 Snap 方式安装。
解决方案:Snap 安装 Certbot(适配所有 RHEL 8/9 系)
第一步:安装并启用 Snapd
# 安装 snapd
sudo dnf install-y snapd
# 启用 snapd 服务
sudo systemctl enable--now snapd.socket
# 创建软链接(必备)
sudo ln-s /var/lib/snapd/snap /snap
第二步:安装 Certbot
# 安装官方最新版 certbot
sudo snap install--classic certbot
# 把 certbot 加入系统命令
sudoln-s /snap/bin/certbot /usr/bin/certbot
第三步:一键申请 HTTPS 证书(自动配置 Nginx)
sudo certbot --nginx
按提示输入:
你的邮箱
同意协议(A)
输入你的域名(如
xxx.com)自动配置 HTTPS + 强制跳转
验证是否成功
测试证书自动续期
sudo certbot renew --dry-run
浏览器访问
https://你的域名,出现锁形图标就成功了!
必备前提(必须满足)
域名已经解析到你的服务器公网 IP
服务器防火墙放行 80/443 端口:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Nginx 已经启动:
sudo systemctl start nginx
总结
新版 RHEL 9 系系统不能用 dnf 装 certbot,必须用 Snap;
以上命令直接复制执行;
证书自动续期、自动配置 Nginx,无需手动维护。
三、Certbot (pip)+ Nginx 插件
针对有些Linux版本,自带 EPEL 但无 certbot rpm 包,不要用 snap、不要乱装源,直接用 pip 官方安装,稳定无冲突。
步骤 1:安装依赖
sudo dnf install-y python3 python3-pip python3-devel mod_ssl
步骤 2:pip 安装 certbot 及 nginx 插件
sudo pip3 install certbot certbot-nginx
步骤 3:全局软链接(让系统直接识别 certbot 命令)
sudoln-s /usr/local/bin/certbot /usr/bin/certbot
步骤 4:检查是否安装成功
certbot --version
输出版本号即为正常。
步骤 5:一键自动配置 Nginx HTTPS
sudo certbot --nginx
交互式操作:
填邮箱
输入
A同意协议选择需要配置 https 的域名
自动写入 ssl 配置、80 强制跳转 443
步骤 6:配置自动续期(必做,证书 90 天有效期)
测试续期
sudo certbot renew --dry-run
添加定时任务
crontab-e
写入一行:
0 3 * * * /usr/bin/certbot renew --quiet
关键前置条件(阿里云环境必看)
阿里云安全组放行:
80、443端口服务器防火墙放行:
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
域名已解析到当前服务器公网 IP
若不想用自动配置,给你纯手动 Nginx 配置
后续想自己改配置,证书路径默认在这里:
证书:/etc/letsencrypt/live/你的域名/fullchain.pem私钥:/etc/letsencrypt/live/你的域名/privkey.pem
四、acme.sh+ Nginx 插件

有些Linux版本采用如上部署方案报错 ValueError: Invalid version. The only valid version for X509Req is 0 的根本原因:系统 Python 3.6 太老旧,和 Certbot 存在底层加密库兼容 BUG,彻底放弃 Certbot,改用 acme.sh(纯 Shell 脚本、无 Python 依赖、100% 适配 Alibaba Cloud Linux 3,零报错)。
解决方案:acme.sh 申请证书
第一步:清理旧的冲突环境(必做)
# 卸载之前装的certbot,避免冲突
sudo pip3 uninstall -y certbot certbot-nginx pyopenssl cryptography
# 删除软链接
sudorm-f /usr/bin/certbot
第二步:一键安装 acme.sh(无 Python、零依赖)
curl https://get.acme.sh |sh-semail=yijunzhao123@163.com
# 让命令生效
source ~/.bashrc
第三步:切换为 Let's Encrypt 官方证书
acme.sh --set-default-ca --server letsencrypt
第四步:自动申请 + 安装证书(直接复制)
创建证书存放目录
sudomkdir-p /etc/nginx/ssl
自动签发证书
(自动识别 Nginx,无需手动配置验证)
acme.sh --issue-d yijunzhao.cn -d www.yijunzhao.cn --nginx
安装证书到 Nginx 目录
(自动配置续期 + 重载)
acme.sh --install-cert -d yijunzhao.cn \
--key-file /etc/nginx/ssl/yijunzhao.key \
--fullchain-file /etc/nginx/ssl/yijunzhao.crt \
--reloadcmd"sudo systemctl force-reload nginx"
第五步:覆盖 Nginx HTTPS 配置(直接复制可用)
编辑配置文件:
sudo vi /etc/nginx/conf.d/yijunzhao.conf
粘贴完整配置(直接用,适配个人域名):
# 80端口强制跳转到HTTPS
server{
listen80;
server_name yijunzhao.cn www.yijunzhao.cn;
return301 https://$host$request_uri;
}
# HTTPS 443主配置
server{
listen443 ssl http2;
server_name yijunzhao.cn www.yijunzhao.cn;
# 证书路径(和上面安装的路径一致)
ssl_certificate /etc/nginx/ssl/yijunzhao.crt;
ssl_certificate_key /etc/nginx/ssl/yijunzhao.key;
# 安全加固
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_cipherson;
# 网站根目录(自行修改)
root /usr/share/nginx/html;
index index.html;
}
保存退出:ESC → 输入 :wq 回车
第六步:重启 Nginx 生效
sudo nginx -t# 检查配置(无报错再下一步)
sudo systemctl restart nginx
✅ 完成!
浏览器访问
https://yijunzhao.cn→ 出现小锁 = 成功自动续期
:acme.sh 会自动续期证书,终身无需手动操作
无任何 Python 报错,完美适配 Linux版
最后检查(阿里云必确认)
控制台安全组放行 80/443 端口
服务器防火墙已放行:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
总结
报错原因:Python3.6 太老,Certbot 底层加密不兼容;
最优方案:acme.sh(纯脚本、无依赖、零报错);
全程自动签发 + 自动续期,HTTPS 永久生效!
五、Nginx Proxy Manager(npm)


Docker 部署的业务系统,不需要系统自带的 Nginx!所有的端口冲突、配置报错、权限问题,全是因为系统 Nginx 和 Docker Halo 冲突了!
第一步:彻底清理冲突环境
先杀死 / 卸载系统自带的 Nginx(它占用 80 端口,和 Docker 冲突运行)
# 强制杀死所有Nginx进程
sudopkill-9 nginx
# 禁用Nginx开机自启
sudo systemctl disable nginx
# 停止Nginx
sudo systemctl stop nginx
# 删除之前的错误配置/证书目录
sudorm-rf /etc/nginx/conf.d/yijunzhao.conf
sudorm-rf /etc/nginx/ssl
第二步:确认你的 Halo 容器正常运行
查看默认端口是 8090,执行命令查看:
sudo docker ps
只要看到 业务系统容器,就说明正常(我们不用管它的端口,后续用代理转发)
第三步:终极方案 → Docker 部署 Nginx Proxy Manager(可视化面板)
不用改配置、不用敲命令、一键申请 HTTPS 证书,完美适配 Docker !
1. 部署代理面板
docker run -d\
--name nginxProxyManager \
--restart always \
-p80:80 \
-p81:81 \
-p443:443 \
-v /opt/npm/data:/data \
-v /opt/npm/letsencrypt:/etc/letsencrypt \
jc21/nginx-proxy-manager:latest
2. 打开可视化面板
浏览器访问:
http://47.100.164.216:81
默认账号密码:
邮箱:admin@example.com
密码:changeme
登录后立刻修改密码
第四步:3 步配置 HTTPS(可视化操作,零代码)
1. 添加反向代理(转发到 业务系统)
点击
Proxy Hosts→Add Proxy HostDomain Names
填写:
yijunzhao.cn,www.yijunzhao.cn
Forward Hostname / IP
填写:
宿主机IP:8090
(直接填
47.100.164.216:8090)保存
2. 一键申请免费 SSL 证书
切换到
SSL选项卡SSL Certificate选择
Request a new SSL Certificate勾选
Force SSL+HTTP/2 Support填写你的邮箱:
yijunzhao123@163.com同意协议 → 保存
自动签发 HTTPS 证书,自动配置,自动续期!
最后一步:确认域名解析(前提已经有公网 IP )
阿里云域名解析:
✅ 最终效果
访问
http://yijunzhao.cn→ 自动跳转到 HTTPS地址栏显示小锁,Halo 博客正常访问
证书自动续期,终身不用管
彻底解决端口冲突、配置错误、权限问题
总结
放弃系统 Nginx
:Docker 部署的业务系统用不到它,它是所有报错的根源
Nginx Proxy Manager
:Docker 环境下最简单的 HTTPS 方案
全程可视化,不用改配置、不用处理权限,完美适配Docker部署的系统!