修复SSL证书链不完整问题certificate verify failed unable to get local issuer certificate

文章目录

前言

  • 最近,我在服务器上更新了 SSL 证书后,虽然网站可以正常访问,浏览器显示证书有效,但在部分文章平台引用服务器上的图片时,图片无法被转存。
  • 排查过程中使用 Python 代码尝试下载图片时,报错如下,怀疑是 SSL 证书链不完整:
Python 复制代码
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate')
  • 进一步使用 SSL Labs Server Test 进行验证,发现服务器的证书链确实不完整,导致部分客户端无法正确验证 SSL 证书。最终通过调整 Nginx 的 SSL 配置 解决了这个问题。本文将详细介绍 如何排查和解决 SSL 证书更新后图片无法转存的问题。

排查过程

怀疑文章平台图片转存问题

  • 在部分文章发布平台上,我们尝试将服务器上的图片转存到平台的存储系统,但始终失败。
  • 为了排除文章发布平台的潜在问题,我测试了 非本服务器的其他图片地址,发现这些图片可以成功转存。这表明 问题出在本服务器,而不是文章平台的转存机制。

尝试使用 Python 代码下载图片

  • 怀疑是 Nginx 服务器 SSL 证书配置问题,为了进一步验证猜想使用 Python 代码直接下载服务器上的图片,代码如下:
Python 复制代码
import requests

url = "https://xxxx/temp-photos/U0AUapam9u.png"
response = requests.get(url)

if response.status_code == 200:
    with open("image.png", "wb") as f:
        f.write(response.content)
    print("图片转存成功")
else:
    print("图片转存失败")
    
# 出现如下报错:
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate')
  • 错误表明 Python 无法验证服务器的 SSL 证书,通常是因为 服务器的证书链不完整,导致某些客户端无法正确验证证书。

使用 SSL Labs Server Test 验证猜想

  • 为了进一步验证猜想,我使用 SSL Labs Server Test 对服务器的 SSL 证书进行检测,结果显示:
txt 复制代码
This server's certificate chain is incomplete. Grade capped to B.
  • 错误表明服务器 没有提供完整的证书链,导致某些客户端(如 Python requests、文章平台的图片转存服务)无法正确验证 SSL 证书。
  • 当然我们可以使用 verify=False 忽略证书校验下载,但是当前场景我们无法使用该方案,也是一个治标不治本的方案。

回顾 SSL 安装命令

  • 安装的证书仅包含本域名,没有使用完整的证书链。
txt 复制代码
acme.sh --install-cert -d xxxx \
  --key-file /root/nginx/conf/conf.d/xxxx.key \
  --cert-file /root/nginx/conf/conf.d/xxxx.cer \
  --reloadcmd "docker container restart nginx"
  • 修复后命令,使用完整证书链 --fullchain-file
txt 复制代码
acme.sh --install-cert -d xxxx \
  --key-file /root/nginx/conf/conf.d/xxxx.key \
  --fullchain-file /root/nginx/conf/conf.d/xxxx.cer \
  --reloadcmd "docker container restart nginx"

ACME 生成的证书

验证

使用 SSL Labs Server Test 验证

  • 检测结果正常

文章发布平台转存验证

  • 正常转存

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

相关推荐
白狐_7981 小时前
【408计算机网络|第01章|408-CN-01】计算机网络概述与体系结构:性能指标、分层、OSI与TCP/IP
网络协议·tcp/ip·计算机网络
MrDJun1 小时前
长期稳定跑网页监控:TLS 指纹、代理选路与请求节流的工程实践
运维·爬虫·python·网络协议·网站监控
AAA@峥2 小时前
Ceph 集群配置管理完整指南
运维·数据库·分布式·ceph
旺仔学长 哈哈2 小时前
基于SpringBoot的在线招聘测评系统的设计与实现----附源码35253+数据库文档
数据库·spring boot·后端·在线招聘
白狐_7982 小时前
【408计算机网络|第03章·上|408-CN-03A】数据链路层(上):组帧、差错控制与可靠传输
网络·网络协议·计算机网络
吴声子夜歌2 小时前
MongoDB 4.2——索引(二)
数据库·mongodb·索引
老赵的博客2 小时前
工控机之udp远程控制
网络·网络协议·udp
怪奇云呼军2 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
努力努力再努力wz2 小时前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
米码收割机2 小时前
【Python】Django恒达科技门户网站(源码+文档)【独一无二】
数据库·python·科技