Administrator
发布于 2026-04-25 / 3 阅读
0
0

基于Nginx的免费SSL证书安装配置实践分享

有很多小伙伴在搭建网站后,不知道如何申请与配置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


# 显示 success 再下一步
重启 Nginx

systemctl restart nginx

8. 验证成功

浏览器访问 https://你的域名,地址栏出现 锁形图标 就搞定了!

总结

  1. RHEL 系系统装 Certbot 必须先装epel-release扩展源;

  2. 安装后直接用certbot --nginx一键配置 HTTPS;

  3. 证书自动续期,无需后期维护。

二、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

按提示输入:

  1. 你的邮箱

  2. 同意协议(A)

  3. 输入你的域名(如 xxx.com

  4. 自动配置 HTTPS + 强制跳转


验证是否成功

  1. 测试证书自动续期

sudo certbot renew --dry-run

  1. 浏览器访问 https://你的域名,出现锁形图标就成功了!


必备前提(必须满足)

  1. 域名已经解析到你的服务器公网 IP

  2. 服务器防火墙放行 80/443 端口:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

  1. Nginx 已经启动:sudo systemctl start nginx


总结

  1. 新版 RHEL 9 系系统不能用 dnf 装 certbot,必须用 Snap;

  2. 以上命令直接复制执行

  3. 证书自动续期、自动配置 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

交互式操作:

  1. 填邮箱

  2. 输入 A 同意协议

  3. 选择需要配置 https 的域名

  4. 自动写入 ssl 配置、80 强制跳转 443


步骤 6:配置自动续期(必做,证书 90 天有效期)

测试续期

sudo certbot renew --dry-run

添加定时任务

crontab-e

写入一行:

0 3 * * * /usr/bin/certbot renew --quiet


关键前置条件(阿里云环境必看)

  1. 阿里云安全组放行:80443 端口

  2. 服务器防火墙放行:

sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

  1. 域名已解析到当前服务器公网 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

第四步:自动申请 + 安装证书(直接复制)

  1. 创建证书存放目录

sudomkdir-p /etc/nginx/ssl

  1. 自动签发证书

    (自动识别 Nginx,无需手动配置验证)

acme.sh --issue-d yijunzhao.cn -d www.yijunzhao.cn --nginx

  1. 安装证书到 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


✅ 完成!

  1. 浏览器访问 https://yijunzhao.cn → 出现小锁 = 成功

  2. 自动续期

    :acme.sh 会自动续期证书,终身无需手动操作

  3. 无任何 Python 报错,完美适配 Linux版


最后检查(阿里云必确认)

  1. 控制台安全组放行 80/443 端口

  2. 服务器防火墙已放行:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload


总结

  1. 报错原因:Python3.6 太老,Certbot 底层加密不兼容;

  2. 最优方案:acme.sh(纯脚本、无依赖、零报错);

  3. 全程自动签发 + 自动续期,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 Host

  • Domain 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 )

阿里云域名解析:

主机记录

类型

记录值

@

A

47.100.164.216

www

A

47.100.164.216


✅ 最终效果

  1. 访问 http://yijunzhao.cn → 自动跳转到 HTTPS

  2. 地址栏显示小锁,Halo 博客正常访问

  3. 证书自动续期,终身不用管

  4. 彻底解决端口冲突、配置错误、权限问题


总结

  1. 放弃系统 Nginx

    :Docker 部署的业务系统用不到它,它是所有报错的根源

  2. Nginx Proxy Manager

    :Docker 环境下最简单的 HTTPS 方案

  3. 全程可视化,不用改配置、不用处理权限,完美适配Docker部署的系统!


评论