HomeContact

我如何修复网站SSL证书问题:完整指南

By Shady Nagy
Published in Linux
February 11, 2026
2 min read
我如何修复网站SSL证书问题:完整指南

Table Of Contents

01
一切问题的开始
02
理解问题所在
03
解决方案1:修复缺失的中间证书
04
解决方案2:强制HTTPS重定向
05
完整诊断命令
06
最终配置文件
07
结果:一切修复完成!✅
08
常见问题解答
09
有用的在线SSL测试工具
10
关键要点
11
最后的思考
12
反馈和问题

一切问题的开始

想象一下这个场景:我刚刚在我的网站shadynagy.com上安装了SSL证书。从我这边看一切都很完美——证书有效,由Sectigo颁发,距离过期还有很长时间(265天!)。但当我在WhyNoPadlock.com上运行快速SSL测试时,却看到了一些令人失望的红色X标记:

强制HTTPS:未强制使用SSL
中间证书无效:缺少中间(bundle)证书

我的心一沉。如果SSL证书无法正常工作,那它有什么用?我的访问者可能会看到安全警告,搜索引擎可能会降低我的排名,最糟糕的是——我的网站看起来不专业。

但好消息是:我修复了所有问题,现在我将一步步向你展示我是如何做到的。

理解问题所在

在深入解决方案之前,让我们先理解这些错误究竟意味着什么:

问题1:缺少中间证书

什么是中间证书?

将SSL证书想象成一条信任链:

  • 你的浏览器信任某些”根”证书颁发机构(如Sectigo)
  • 这些机构向下级机构颁发”中间”证书
  • 这些下级机构向你的网站颁发证书

你的网站需要同时向浏览器发送你的证书和中间证书。没有中间证书,浏览器无法验证信任链。

实际影响:

  • 某些浏览器显示安全警告
  • 移动设备经常无法连接
  • 你的网站对访问者来说看起来不安全

问题2:没有HTTP到HTTPS重定向

这意味着什么?

当有人输入http://shadynagy.com(没有’s’)时,应该自动重定向到https://shadynagy.com。如果没有这个重定向:

  • 访问者可以通过不安全的HTTP访问你的网站
  • 搜索引擎看到重复的内容(HTTP和HTTPS版本)
  • 你失去了HTTPS带来的SEO优势

解决方案1:修复缺失的中间证书

步骤1:理解根本原因

我发现我的nginx配置使用了错误的指令。这是我原来的配置:

# ❌ 错误配置
ssl_certificate /etc/nginx/ssl/shadynagy.com.crt;
ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;

问题在于:ssl_trusted_certificate用于OCSP stapling(一个性能特性),而不是向浏览器发送证书链!

步骤2:创建完整链证书

解决方案是创建一个”fullchain”证书,将你的证书与中间证书合并。

命令:

cat /etc/nginx/ssl/shadynagy.com.crt /etc/nginx/ssl/shadynagy.com.ca-bundle > /etc/nginx/ssl/shadynagy.com-fullchain.crt

这个命令做什么:

  • cat - 连接(合并)文件
  • 第一个文件:你的网站证书
  • 第二个文件:中间CA bundle
  • > - 输出到一个名为”fullchain”的新文件

示例解释: 想象你有两块拼图:

  1. 你的证书(A块)
  2. 中间证书(B块)

你正在把它们粘在一起,创建一个浏览器能够理解的完整拼图。

步骤3:更新Nginx配置

打开你的SSL配置文件:

nano /etc/nginx/conf.d/shadynagy.com-ssl.conf

更新为以下内容:

server {
listen 443 ssl http2; # 端口443启用SSL和HTTP/2
# ✅ 正确 - 使用fullchain证书
ssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;
# 可选:保留用于OCSP stapling(性能提升)
ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;
root /var/www/shady-nagy.com/html;
index index.html index.htm;
server_name shadynagy.com www.shadynagy.com;
access_log /var/log/nginx/nginx.vhost.access.log;
error_log /var/log/nginx/nginx.vhost.error.log;
location / {
try_files $uri $uri/ =404;
}
}

关键更改说明:

  1. listen 443 ssl http2;

    • 443 = HTTPS端口
    • ssl = 启用SSL
    • http2 = 启用HTTP/2以获得更好性能
    • 这替代了已弃用的ssl on;指令
  2. ssl_certificate 现在指向fullchain而不仅仅是你的证书

  3. ssl_trusted_certificate 保留用于OCSP stapling(可选但推荐)

步骤4:测试并应用更改

测试配置:

nginx -t

预期输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果看到任何错误,请仔细检查文件路径和语法!

应用更改:

systemctl reload nginx

为什么用reload而不是restart?

  • reload在不断开连接的情况下应用更改
  • restart会短暂使你的网站离线

✅ 此修复的好处

  • ✅ 所有浏览器都能验证你的SSL证书
  • ✅ 不再出现”无效证书”警告
  • ✅ 移动设备正常连接
  • ✅ 更好的信任度和SEO排名
  • ✅ 专业的外观

解决方案2:强制HTTPS重定向

调查过程

首先,我检查了HTTP配置:

cat /etc/nginx/conf.d/shadynagy.com.conf

我发现了这个:

# ❌ 错误配置
server {
listen 80;
root /var/www/shady-nagy.com/html;
server_name shadynagy.com www.shadynagy.com;
location / {
try_files $uri $uri/ =404;
}
return 301 https://$server_name$request_uri; # 永远不会执行到!
}

问题在于: Nginx从上到下读取配置。当请求进来时:

  1. 它匹配location /
  2. 处理请求
  3. 永远不会执行到重定向行

这就像在道路之后才放置”绕行”标志!

步骤1:创建正确的重定向配置

修复方案:

# ✅ 正确配置
server {
listen 80;
listen [::]:80; # 同时监听IPv6
server_name shadynagy.com www.shadynagy.com;
# 将所有HTTP流量重定向到HTTPS
return 301 https://$host$request_uri;
}

各部分的作用:

  • listen 80; - 监听HTTP请求(端口80)
  • listen [::]:80; - 同时监听IPv6 HTTP请求
  • server_name - 此配置适用于哪些域名
  • return 301 - 发送永久重定向(301状态码)
  • $host - 用户输入的域名(保留www与非www)
  • $request_uri - 他们请求的路径(例如/about或/contact)

实际示例:

如果有人访问:http://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide
他们会被重定向到:https://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide

步骤2:应用并测试

测试配置:

nginx -t

重新加载nginx:

systemctl reload nginx

测试重定向:

curl -I http://shadynagy.com

预期输出:

HTTP/1.1 301 Moved Permanently
Location: https://shadynagy.com/

完美!但是等等…

意外发现:防火墙阻止了端口80!

当我在浏览器中测试时,仍然不起作用!经过一番调查:

firewall-cmd --list-all

输出:

services: https

注意到缺少什么了吗?HTTP(端口80)!

重定向配置完全正确,但我的防火墙阻止了传入的HTTP流量。这就像安装了前门,却在前面建了一堵墙!

步骤3:打开防火墙

添加HTTP服务:

firewall-cmd --permanent --add-service=http

重新加载防火墙:

firewall-cmd --reload

验证是否成功:

firewall-cmd --list-all

现在你应该看到:

services: http https

✅ 此修复的好处

  • ✅ 所有访问者自动使用HTTPS
  • ✅ SEO没有重复内容问题
  • ✅ 访问者获得更好的安全性
  • ✅ 改善搜索引擎排名
  • ✅ 浏览器中显示绿色挂锁
  • ✅ 与访问者建立信任

完整诊断命令

以下是我在故障排除期间使用的所有命令:

检查Nginx配置

# 查找所有监听端口80的server块
grep -r "listen 80" /etc/nginx/
# 测试nginx配置语法
nginx -t
# 显示完整nginx配置
nginx -T
# 查看特定server块
nginx -T 2>/dev/null | grep -A 15 "server_name shadynagy.com"

检查Nginx状态

# nginx是否运行?
systemctl status nginx
# 重新加载nginx(无停机应用更改)
systemctl reload nginx
# 重启nginx(短暂停机)
systemctl restart nginx
# 检查错误日志
tail -20 /var/log/nginx/error.log

测试HTTP到HTTPS重定向

# 测试重定向(绕过浏览器缓存)
curl -I http://shadynagy.com
# 跟随所有重定向
curl -IL http://shadynagy.com

检查端口状态

# nginx是否在端口80上监听?
ss -tlnp | grep :80
# nginx是否在端口443上监听?
ss -tlnp | grep :443

检查防火墙

# 列出所有防火墙规则
firewall-cmd --list-all
# 永久添加HTTP
firewall-cmd --permanent --add-service=http
# 永久添加HTTPS
firewall-cmd --permanent --add-service=https
# 应用更改
firewall-cmd --reload

最终配置文件

HTTP配置(端口80)

文件: /etc/nginx/conf.d/shadynagy.com.conf

server {
listen 80;
listen [::]:80;
server_name shadynagy.com www.shadynagy.com;
return 301 https://$host$request_uri;
}

HTTPS配置(端口443)

文件: /etc/nginx/conf.d/shadynagy.com-ssl.conf

server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;
ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;
root /var/www/shady-nagy.com/html;
index index.html index.htm index.nginx-debian.html;
server_name shadynagy.com www.shadynagy.com;
access_log /var/log/nginx/nginx.vhost.access.log;
error_log /var/log/nginx/nginx.vhost.error.log;
location / {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
try_files $uri $uri/ =404;
}
}

结果:一切修复完成!✅

在实施所有修复后,我在WhyNoPadlock.com上的SSL测试显示:

SSL连接 - 通过
有效证书 - SSL证书正确安装
强制HTTPS - Web服务器强制使用SSL
域名匹配 - 证书与域名匹配
签名 - 使用sha256WithRSAEncryption
过期日期 - 证书当前有效(2026-11-03过期)
混合内容 - 无混合内容

满分!

常见问题解答

Q1:为什么需要中间证书?

答:中间证书创建了从你的网站到受信任根证书颁发机构的”信任链”。没有它:

  • 浏览器无法验证你的证书是否合法
  • 访问者会看到可怕的安全警告
  • 移动设备经常无法连接
  • 你的网站看起来不专业且不安全

可以这样想:如果有人自我介绍说”我是约翰,莎拉的朋友”,你可能不会信任他。但如果莎拉是你最好的朋友,她为约翰担保,你就会信任他。中间证书就是莎拉为你的网站证书担保。

Q2:nginx中ssl_certificatessl_trusted_certificate有什么区别?

答:很好的问题!

  • ssl_certificate:这是nginx发送给浏览器以证明你网站身份的内容。它应该包含你的证书和中间证书(fullchain)。

  • ssl_trusted_certificate:这用于OCSP stapling,一个性能特性。Nginx使用它代表客户端验证证书吊销状态。它不会发送给浏览器。

类比:

  • ssl_certificate = 你向他人展示的身份证
  • ssl_trusted_certificate = 你自己参考的规则副本

Q3:为什么在重定向中使用$host而不是$server_name?

答:

示例场景:

  • 你的配置有:server_name shadynagy.com www.shadynagy.com;
  • 用户访问:http://www.shadynagy.com

使用$server_name:重定向到https://shadynagy.com(去掉www)
使用$host:重定向到https://www.shadynagy.com(保留www)

使用$host尊重用户输入的内容,避免不必要的额外重定向。

Q4:为什么重定向在curl中有效但在浏览器中无效?

答:这通常是以下三个问题之一:

  1. 防火墙阻止端口80(我的问题!) - 重定向配置正确,但传入的HTTP流量从未到达nginx。

  2. 浏览器缓存 - 浏览器会积极缓存重定向。解决方案:在无痕模式下测试或清除缓存。

  3. DNS缓存 - 你的计算机可能有旧的DNS记录。解决方案:刷新DNS缓存或等待几个小时。

专业提示:总是先用curl -I测试,因为它绕过所有缓存!

Q5:应该使用return还是rewrite进行HTTPS重定向?

答:总是使用return进行重定向!

return(推荐):

return 301 https://$host$request_uri;
  • 更快(nginx立即停止处理)
  • 意图更清晰
  • 不易出错

rewrite(避免用于简单重定向):

rewrite ^ https://$host$request_uri permanent;
  • 较慢(使用正则表达式引擎)
  • 更复杂
  • 容易创建无限循环

经验法则:使用return进行重定向,只在需要修改URL结构时使用rewrite

Q6:nginx的reloadrestart有什么区别?

答:

systemctl reload nginx(推荐):

  • 优雅地应用配置更改
  • 保持现有连接活动
  • 无停机时间
  • 应用前测试配置(如果配置损坏则不会重新加载)

systemctl restart nginx(谨慎使用):

  • 完全停止nginx,然后重新启动
  • 断开所有活动连接
  • 短暂停机(通常几毫秒到几秒)
  • 当reload不起作用时有用

何时使用restart而不是reload:

  • 添加新模块时
  • reload无法获取更改时
  • 调试奇怪问题时

Q7:如何知道防火墙是否阻止流量?

答:运行这些诊断命令:

# 检查nginx是否在端口80上监听
ss -tlnp | grep :80
# 如果在这里看到nginx,说明它正在监听
# 检查防火墙规则
firewall-cmd --list-all
# 在服务列表中查找'http'
# 从服务器外部测试
curl -I http://your-domain.com
# 如果超时,防火墙可能正在阻止

如果nginx正在监听但从外部curl超时→防火墙就是问题所在!

Q8:我的SSL测试显示”混合内容”警告。这是什么意思?

答:当你的HTTPS页面通过HTTP加载资源(图片、脚本、CSS)时就会发生混合内容。

问题示例:

<!-- ❌ 错误 - 在HTTPS页面上通过HTTP加载图片 -->
<img src="http://shadynagy.com/image.jpg">

解决方案:

<!-- ✅ 好 - 使用HTTPS -->
<img src="https://shadynagy.com/image.jpg">
<!-- ✅ 好 - 使用协议相对URL -->
<img src="//shadynagy.com/image.jpg">
<!-- ✅ 最佳 - 使用相对URL -->
<img src="/image.jpg">

检查混合内容:

  1. 在Chrome中打开你的网站
  2. 按F12(开发者工具)
  3. 在Console标签中查找警告

Q9:每次续订SSL证书都需要这样做吗?

答:部分需要。

需要再次做的:

  • 创建新的fullchain证书(合并新证书+中间证书)
  • 替换旧的fullchain文件

不需要再次做的:

  • 修改nginx配置文件(它们将引用相同的路径)
  • 更改防火墙规则
  • 设置重定向

专业提示:使用Let’s Encrypt/Certbot自动化证书续订,它会自动处理fullchain!

Q10:在正式上线前可以测试SSL配置吗?

答:当然可以!方法如下:

1. 测试nginx配置语法:

nginx -t

2. 使用curl在本地测试:

# 测试重定向
curl -I http://localhost
# 测试HTTPS(本地测试可能会出现证书警告)
curl -Ik https://localhost

3. 使用在线工具:

4. 在测试环境中测试: 如果可能,设置一个测试子域(如staging.shadynagy.com)并先在那里测试。

Q11:什么是HTTP/2,为什么要添加它?

答:HTTP/2是HTTP协议的更新、更快版本。

好处:

  • ✅ 多路复用:多个文件通过一个连接同时下载
  • ✅ 头部压缩:更小的请求/响应
  • ✅ 服务器推送:服务器可以在浏览器请求前发送文件
  • ✅ 更好的移动性能

如何启用:

listen 443 ssl http2; # 只需在这里添加'http2'!

要求:

  • 必须启用HTTPS(HTTP/2需要SSL)
  • Nginx 1.9.5或更高版本
  • OpenSSL 1.0.2或更高版本

验证:

curl -I --http2 https://shadynagy.com
# 在响应中查找"HTTP/2 200"

Q12:如果忘记使防火墙规则永久化会怎样?

答:如果不使用--permanent,你的防火墙规则在重启服务器后会消失!

非永久化(重启后丢失):

firewall-cmd --add-service=http # ❌ 重启后消失

永久化(重启后保留):

firewall-cmd --permanent --add-service=http # ✅ 重启后保留
firewall-cmd --reload # 立即应用

检查规则是否永久化:

# 显示运行时(当前)规则
firewall-cmd --list-all
# 显示永久(已保存)规则
firewall-cmd --permanent --list-all

如果它们不匹配,你需要使更改永久化!

Q13:应该多久检查一次SSL证书?

答:这是一个好的维护计划:

每月:

  • 检查证书过期日期
  • 在WhyNoPadlock.com运行快速SSL测试

过期前:

  • 在过期前30天续订证书
  • 立即测试新证书
  • 如果可能设置自动续订

服务器更新后:

  • 在任何nginx/OpenSSL更新后测试SSL
  • 验证重定向仍然有效

设置监控: 许多服务提供免费SSL监控:

  • UptimeRobot
  • Pingdom
  • SSL Labs监控

它们会在证书过期前通过电子邮件通知你!

Q14:如果一台服务器上有多个域名怎么办?

答:你需要为每个域名创建单独的server块。

多域名示例:

# 域名1:shadynagy.com
server {
listen 80;
server_name shadynagy.com www.shadynagy.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name shadynagy.com www.shadynagy.com;
ssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;
root /var/www/shadynagy.com;
}
# 域名2:myotherdomain.com
server {
listen 80;
server_name myotherdomain.com www.myotherdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name myotherdomain.com www.myotherdomain.com;
ssl_certificate /etc/nginx/ssl/myotherdomain.com-fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/myotherdomain.com.key;
root /var/www/myotherdomain.com;
}

替代方案:使用通配符证书或多域名(SAN)证书,用一个证书覆盖多个域名。

Q15:为什么即使完成所有这些修复后,我的证书仍显示为”不安全”?

答:检查这些常见问题:

  1. 证书名称不匹配:

    • 证书是为www.shadynagy.com签发的,但你正在访问shadynagy.com
    • 解决方案:获取覆盖两者的证书(SAN证书)
  2. 证书过期:

    • 检查过期日期:openssl x509 -in certificate.crt -noout -dates
    • 解决方案:续订证书
  3. 混合内容:

    • HTTPS页面加载HTTP资源
    • 检查浏览器控制台中的警告
  4. nginx配置中的域名错误:

    • server_name与你访问的域名不匹配
    • 解决方案:将所有域名变体添加到server_name
  5. 证书不受信任:

    • 使用自签名证书
    • 解决方案:从受信任的CA获取证书(Let’s Encrypt是免费的!)

快速诊断:

# 检查正在提供什么证书
openssl s_client -connect shadynagy.com:443 -servername shadynagy.com

有用的在线SSL测试工具

🔗 SSL Labs - 最全面的SSL测试,给你A-F评级

🔗 WhyNoPadlock - 快速视觉检查常见SSL问题

🔗 SSL Shopper - 检查证书安装和链

🔗 Security Headers - 测试HTTP安全头

🔗 High-Tech Bridge - 详细的SSL/TLS和安全评估

关键要点

关于中间证书:

✅ 始终创建fullchain证书(证书+CA bundle)
✅ 对fullchain使用ssl_certificate指令
✅ 仅对OCSP stapling使用ssl_trusted_certificate
✅ 安装后使用在线工具测试

关于HTTPS重定向:

✅ 使用return 301进行重定向(不是rewrite)
✅ 将重定向放在location块之前
✅ 使用$host保留用户的域名输入
✅ 记得在防火墙中打开端口80!

关于测试:

✅ 重新加载前始终用nginx -t测试nginx配置
✅ 使用curl绕过浏览器缓存
✅ 用firewall-cmd --list-all检查防火墙规则
✅ 用ss -tlnp验证端口监听

关于维护:

✅ 设置证书过期提醒
✅ 使防火墙规则永久化
✅ 保持nginx和OpenSSL更新
✅ 定期测试SSL配置

最后的思考

SSL配置一开始可能看起来令人生畏,但一旦理解了各个组成部分,就会觉得很有逻辑:

  1. 证书链 - 证明你的身份
  2. HTTPS重定向 - 强制安全连接
  3. 防火墙规则 - 允许流量到达你的服务器

将问题分解成这些组件使诊断和修复变得更加容易。

最重要的教训?当某些东西不起作用时,逐层检查:

  • nginx配置是否正确?(nginx -t)
  • nginx是否在监听?(ss -tlnp)
  • 防火墙是否允许流量?(firewall-cmd --list-all)
  • 本地是否工作?(curl -I http://localhost)

这种系统化的方法为我节省了数小时的挫折!

反馈和问题

我们很乐意听到你对本教程的反馈!如果你有任何问题或改进建议,请随时联系。你可以在下面留言,或通过以下渠道联系我们:

  1. 电子邮件:info@shadynagy.com
  2. Twitter:@ShadyNagy_
  3. LinkedIn:Shady Nagy
  4. GitHub:ShadyNagy

觉得有帮助?与正在为SSL配置苦恼的人分享吧!


Tags

#SSL#HTTPS#SSLCertificate#Nginx#RockyLinux#Linux#WebSecurity#SSLTroubleshooting#ServerConfiguration#IntermediateCertificate#Firewall#Firewalld#CertificateChain#HTTPSRedirect#NginxSSL#ForceHTTPS#Sectigo#LetsEncrypt#WebServerSetup#SSLConfiguration#TLS#RockyLinux9

Share


Shady Nagy

Shady Nagy

Software Innovation Architect

Topics

AI
Angular
dotnet
GatsbyJS
Github
Linux
MS SQL
Oracle

Quick Links

Contact Us

Social Media