浏览器里一个红色的“您的连接不是私密连接”,或者干脆转圈转到超时。证书明明已经装了,为什么还是打不开?这类问题基本逃不出几个方向:端口没通、证书本身有问题、Web服务配置写错、中间多了一层CDN。下面按这个顺序排查,Nginx的部分会给出具体的配置和命令。
先看现象,再对应到可能的原因:
现象 | 常见原因 | 先查什么 |
浏览器提示连接不安全 | 证书过期、域名不匹配、证书链不完整 | 点开证书详情,看有效期和域名 |
HTTPS访问连接超时 | 443端口没放行,或没有服务在监听 | 安全组、防火墙、监听状态 |
ERR_SSL_PROTOCOL_ERROR | 443端口上跑的不是SSL服务(如listen漏写ssl),或协议、加密套件不匹配 | Nginx的listen配置,用openssl s_client测试 |
提示证书过期或域名不匹配 | 证书已过期,或没有覆盖当前访问的域名 | 看有效期和证书包含的域名列表 |
HTTP可以访问,HTTPS不行 | 80端口正常,443没放行或没配置 | 按443端口的思路排查 |
只有部分域名或子域名打不开 | 证书没有覆盖该子域名,或该域名没有配置server_name | 证书的域名列表、server_name、DNS |
服务器是否正常运行: 能否登录,Web服务是否在跑,比如 systemctl status nginx。
公网IP能否连接: 从外部网络对服务器的80端口做一次连接测试,排除整机不通。
云平台安全组: 入站规则要放行TCP 443,同时放行80,HTTP跳转和部分证书申请的验证要用到。
Linux系统防火墙: 查看 ufw status、firewall-cmd --list-all 或 iptables -S,确认没有拦截443。
Nginx或Apache是否监听443: 用下面的命令查看。
sudo ss -lntp | grep -E ':(80|443)' |
用工具验证连通性: 在另一台机器上执行:
nc -zv 服务器IP 443 # 只测端口通不通 curl -vk https://服务器IP # -k 忽略证书错误,看能否建立连接 openssl s_client -connect 服务器IP:443 -servername example.com # 看握手和证书 |
结果的含义:提示连接被拒绝,说明没有服务在监听;一直卡住直到超时,通常是安全组或防火墙把包丢了;能完成握手但报证书错误,就进入了下一部分的证书问题。
证书已经过期: 用 openssl x509 -noout -dates -in 证书文件 查看有效期。
证书绑定的域名不匹配: 证书要覆盖你访问的域名,www和不带www是两个域名;通配符证书 *.example.com 不包含 example.com 本身。
证书文件没有安装完整: 复制时漏掉了开头或结尾的BEGIN、END行,或者混入了多余的空格。
证书链缺失中间证书: 桌面浏览器有时会自动补全中间证书,所以你在电脑上看一切正常,换成手机App、curl或某些旧设备却报错。Nginx要使用包含中间证书的fullchain文件。
证书与私钥不匹配: 对比两者的公钥指纹,必须一致:
openssl x509 -in fullchain.pem -noout -pubkey | openssl md5 openssl pkey -in privkey.pem -pubout | openssl md5 |
免费SSL证书未成功续期: 例如Let’s Encrypt的证书有效期较短,要靠自动续期。常见失败原因是80端口被占用、域名解析变化,还有一个容易忽略的:续期成功但Nginx没有重载,内存里仍然是旧证书。可以用 sudo certbot renew --dry-run 做续期演练。
下面的内容依据Nginx官方文档中关于配置HTTPS服务器的说明,涉及HTTPS监听、证书与私钥文件、证书链和SNI。
nginx -V 2>&1 | grep -o with-http_ssl_module # 有输出说明支持SSL |
一份最小可用的配置如下,注意listen后面必须有ssl:
server { listen 443 ssl; server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 服务器证书 + 中间证书 ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 与上面证书配对的私钥 ssl_protocols TLSv1.2 TLSv1.3;
location / { root /var/www/html; index index.html index.htm; } } |
证书和私钥是一对:证书里包含公钥,私钥留在服务器上,握手时用私钥证明自己就是证书的拥有者。两者不配对,握手必然失败,Nginx启动或重载时就会报错。路径写错、文件不存在,也是在这里暴露。
私钥一旦泄露,别人就能冒充你的网站,所以生产环境要限制访问。Nginx主进程以root读取私钥,之后才降权运行,因此私钥设为只有root可读即可:
sudo chown root:root /etc/nginx/ssl/privkey.pem sudo chmod 600 /etc/nginx/ssl/privkey.pem |
同一个IP上有多个站点时,Nginx靠SNI(客户端握手时带上的域名)选择server块和对应的证书,所以每个server块的server_name要和它的证书一致,没有匹配时会落到默认站点,拿到的就是别的域名的证书。证书链的顺序是服务器证书在前,中间证书在后,根证书不需要放。
sudo nginx -t # 检查语法和证书文件能否读取 sudo systemctl reload nginx # 重载配置,不中断现有连接 |
改完证书或配置,必须先 nginx -t 通过,再重载。只替换了证书文件而不重载,Nginx仍在使用旧证书。
证书导入: 证书要带私钥(常见是.pfx格式),导入到“本地计算机”的个人存储;中间证书导入到“中间证书颁发机构”。
IIS网站绑定和HTTPS站点绑定: 在IIS管理器里,站点的绑定中添加https,端口443,并选择对应的证书。
443端口开放: 检查Windows防火墙的入站规则,以及云平台安全组。
域名和证书对应关系: 绑定的主机名要被证书覆盖。
多个站点共用IP时: 绑定里勾选“需要服务器名称指示”(SNI),否则同一IP和端口上只能选一个证书。
接入CDN之后,有两段加密:用户到CDN,和CDN到源站,各自用各自的证书,这是最容易混淆的地方。以Cloudflare为例,它的Origin CA证书只用于Cloudflare和源站之间的加密,浏览器并不信任这类证书,不能直接替代公共CA签发的证书。如果域名没有走Cloudflare的代理,而是直接解析到源站,用户的浏览器就会报证书错误。
CDN节点没有正确配置证书: 用户访问端的证书需要在CDN侧配置或由CDN签发。
源站证书不受信任: 在要求校验源站证书的模式下,源站证书必须有效,自签证书会失败。
源站与CDN之间的加密模式不匹配: 例如CDN以明文回源,而源站强制跳转到HTTPS,会出现反复重定向;反过来,要求严格校验时源站证书又不合格。
DNS解析指向错误的服务器: 域名没有解析到CDN,或者解析到了旧服务器。
多台源站只安装了部分证书: CDN回源到哪台,哪台就得有可用的证书。
# 查看证书有效期、颁发者和域名 echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -issuer -subject
# 查看握手结果和证书链,注意 Verify return code 应为 0 (ok) openssl s_client -connect example.com:443 -servername example.com -showcerts
# 检查HTTP到HTTPS的跳转 curl -I http://example.com |
证书有效期、域名、证书链、TLS握手: 用上面的命令逐项确认。
HTTP到HTTPS跳转: 返回301,并且跳转目标是正确的HTTPS地址,不要出现循环。
浏览器控制台: 打开开发者工具,检查有没有“混合内容”警告,也就是HTTPS页面里还在加载HTTP的图片、脚本。
续期机制: 确认自动续期任务存在,并且续期后会重载服务。
证书到期提醒: 在到期前至少提前两周发通知,不能只依赖一个人记得。
自动续期任务监控: 续期任务本身会失败,要监控它的执行结果。
证书和私钥备份: 加密保存在服务器之外的位置。
配置文件修改前备份: 改配置前复制一份,出错时能立刻还原。
定期检查443端口: 用外部拨测持续监控,不要等用户反馈。
多站点统一管理: 站点多的时候,用一份清单记录各个域名的证书、到期时间和部署位置。
下面这条命令可以放进定时任务,证书在14天内到期时会返回非零状态,用来触发告警:
openssl x509 -checkend 1209600 -noout -in /etc/nginx/ssl/fullchain.pem |
恒讯科技的香港云主机可用于部署HTTPS网站,Linux和Windows的服务器环境都有对应的使用场景;遇到网络和端口方面的问题,可以联系技术支持协助排查;网站运行一段时间后,如果需要升级CPU、内存等资源,也可以一并咨询。
常见原因是443端口没放行或没监听、证书过期或域名不匹配、证书链不完整、证书和私钥不配对、Nginx配置写错,或接入CDN后的加密模式不一致。按本文第二到第六部分顺序排查。
先用ss确认服务有没有监听,再检查系统防火墙和云平台安全组,最后从外部用nc或curl测试。连接被拒绝是没有监听,超时多半是被防火墙或安全组拦截。
不需要完全重启,先执行 nginx -t 检查通过,再执行 reload 即可。只替换文件而不重载,不会生效。
证书里的域名不能修改,需要向证书颁发机构重新申请,或者重新签发包含正确域名的证书,再部署并重载服务。
会。证书过期后,浏览器会提示不安全,用户可能无法访问。免费证书的有效期较短,要确保自动续期正常,并监控续期结果。
取决于CDN回源的方式。如果使用HTTPS回源,源站需要有可用的证书,要求严格校验时还必须是受信任的证书;如果以HTTP回源,源站不需要证书,但CDN到源站这一段是明文传输,不推荐。
Copyright © 2013-2020. All Rights Reserved. 恒讯科技 深圳市恒讯科技有限公司 粤ICP备20052954号 IDC证:B1-20230800.移动站


