关于weget “无法建立SSL连接”的解决方法

本文介绍了一个关于使用wget下载文件时遇到的无法建立SSL连接的问题,并提供了解决方案。通过添加--no-check-certificate选项,成功解决了wget在HTTPS下载过程中因证书验证失败而导致的错误。


原文链接:http://www.bubuko.com/infodetail-1277720.html

问题原型

[root@POT-DOG ~]# wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
--2017-10-04 22:42:01--  https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
正在解析主机 storage.googleapis.com (storage.googleapis.com)... 216.58.200.240, 2404:6800:4008:801::2010
正在连接 storage.googleapis.com (storage.googleapis.com)|216.58.200.240|:443... 已连接。
无法建立 SSL 连接。

问题原因

wget在使用HTTPS协议时,默认会去验证网站的证书,而这个证书验证经常会失败。

解决方案

原命令加上"--no-check-certificate"选项,就能排除掉这个错误。
EX:
[root@POT-DOG ~]# wget --no-check-certificate  https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
--2017-10-04 22:50:02--  https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
正在解析主机 storage.googleapis.com (storage.googleapis.com)... 216.58.200.48, 2404:6800:4008:800::2010
正在连接 storage.googleapis.com (storage.googleapis.com)|216.58.200.48|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:89803580 (86M) [application/x-gzip]
正在保存至: “go1.8.linux-amd64.tar.gz”


100%[=============================================>] 89,803,580  10.3MB/s 用时 8.9s   


2017-10-04 22:50:12 (9.67 MB/s) - 已保存 “go1.8.linux-amd64.tar.gz” [89803580/89803580])
Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Downloaded: ./omada_web/packages/container/src/theme/img/virtualDeviceIcon\EAP215-Bridge.png Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Downloaded: ./omada_web/packages/container/src/theme/img/deviceIcon\EAP115-Bridge.png Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Downloaded: ./omada_web/packages/container/src/theme/img/topology/deviceicon\EAP115-Bridge.png Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Downloaded: ./omada_web/packages/container/src/theme/img/virtualDeviceIcon\EAP115-Bridge.png Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Error downloading https://uat-omada-common-data-manager-storage-aps1.s3.ap-southeast-1.amazonaws.com/device_pic/EAP720-WE-V1/EAP720-WE-V1-icon.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251124T011948Z&X-Amz-SignedHeaders=host&X-Amz-Expires=176400&X-Amz-Credential=AKIATRBVRIT6RAOFPUFS%2F20251124%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Signature=7b9bfd29fc6357fa6ec3b8f66706a41f4d3ca4946d833cb2a9fd2d145cb25ac9: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)> Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Error downloading https://uat-omada-common-data-manager-storage-aps1.s3.ap-southeast-1.amazonaws.com/device_pic/EAP720-WE-V1/EAP720-WE-V1-topo.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251124T011948Z&X-Amz-SignedHeaders=host&X-Amz-Expires=176400&X-Amz-Credential=AKIATRBVRIT6RAOFPUFS%2F20251124%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Signature=3639a484192bd28ee7eed09d35a66d0c93655e1873ffab1033a35d429dcead59: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)> Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Error downloading https://uat-omada-common-data-manager-storage-aps1.s3.ap-southeast-1.amazonaws.com/device_pic/EAP720-WE-V1/EAP720-WE-V1-virtual.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251124T011948Z&X-Amz-SignedHeaders=host&X-Amz-Expires=176400&X-Amz-Credential=AKIATRBVRIT6RAOFPUFS%2F20251124%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Signature=24433f7af8ea49e2d2fb86180698622fb3d7449c3dd2563bfeea5f205c6e140f: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)> Warning: CA certificate not found at C:\home\jenkins\workspace\smb_solution_omada_controller\smb-omadac-v5.10above-win-compile-basic-testing\certs\cacert.pem, using default certs. Error downloading https://uat-omada-common-data-manager-storage-ap 有的成功,有的失败
最新发布
11-25
你现在的输出日志显示: - **部分图片下载成功**(如 `EAP115-Bridge.png`) - **部分图片失败**,报错: ``` [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate ``` - 同时一直提示: ``` Warning: CA certificate not found at ... certs/cacert.pem ``` --- ## ✅ 综合分析与解决方案 ### 🔍 问题分层解析 | 现象 | 原因 | 是否致命 | |------|------|--------| | 成功下载了某些图片 | 表明网络可达、路径处理 OK、代码基本逻辑正确 | ❌ 非致命 | | 失败:`CERTIFICATE_VERIFY_FAILED` | SSL 证书验证失败,无法建立安全连接 | ✅ 致命 | | 提示 `CA certificate not found` | 程序试图加载自定义 CA 证书但文件不存在 | ⚠️ 警告 → 导致 SSL 验证失败 | --- ### 🧩 根本原因总结 > **你的程序尝试使用一个本地的 CA 证书 (`cacert.pem`) 来验证 S3 的 HTTPS 证书,但该文件不存在。** > > 当 `context.load_verify_locations()` 加载失败后,你又没有 fallback 到合适的信任链,导致后续请求在某些环境下 SSL 握手失败。 虽然我们之前加了 fallback 使用默认上下文,但在一些受限环境(如 Jenkins 构建机、无完整系统证书库的 Windows),**即使“使用默认 certs”也可能不完整或缺失根证书**,从而导致部分域名(尤其是 AWS S3)验证失败。 --- ## ✅ 解决方案(推荐组合拳) ### ✅ 方案一:【推荐】使用 `requests` 库 + 自动证书处理(最简单可靠) Python 内置的 `urllib` 对 SSL 和证书的支持较弱,建议改用更现代的 `requests`,它会自动处理大多数证书问题,并支持指定 CA bundle。 #### 1. 安装 requests(如果还没装) ```bash pip install requests ``` #### 2. 修改后的代码(使用 requests) ```python import os import requests # 全局计数器 CNAT_DOWNLOAD_NUM = 0 DOWNLOAD_NUM = 0 def download_image(url, save_path, model_name): global CNAT_DOWNLOAD_NUM, DOWNLOAD_NUM try: # --- 确保保存目录存在 --- os.makedirs(save_path, exist_ok=True) # --- 设置自定义 CA Bundle 路径(可选)--- ca_cert_path = os.path.join(os.getcwd(), "certs", "cacert.pem") verify_ssl = ca_cert_path if os.path.isfile(ca_cert_path) else True # 使用系统默认证书 # --- 发起请求 --- headers = {"User-Agent": "DeviceImageDownloader/1.0"} response = requests.get(url, headers=headers, timeout=10, verify=verify_ssl) if response.status_code == 200: file_path = os.path.join(save_path, f"{model_name}.png") with open(file_path, 'wb') as f: f.write(response.content) print(f"Downloaded: {file_path}") DOWNLOAD_NUM += 1 else: CNAT_DOWNLOAD_NUM += 1 print(f"HTTP {response.status_code}: {url}") except Exception as e: print(f"Error downloading {url}: {e}") CNAT_DOWNLOAD_NUM += 1 ``` > ✅ 这个版本的优点: > - 自动处理重定向 > - 更好的错误信息 > - 支持 CA bundle 或自动使用系统证书 > - 不需要手动管理 SSL context --- ### ✅ 方案二:修复原始 urllib 版本(保留原技术栈) 如果你必须用 `urllib`,请确保: #### 1. 把 `cacert.pem` 文件放到正确位置 你需要将有效的 CA 证书包放入: ``` <your_project_root>/certs/cacert.pem ``` 👉 获取方式: ```bash # 方法1:从 certifi 包中导出(这是 Python requests 默认使用的) python -c "import certifi; print(certifi.where())" # 输出路径,例如:C:\Python\... \cacert.pem cp $(python -m certifi) ./certs/cacert.pem ``` 或者手动下载: ```bash curl -o certs/cacert.pem https://curl.se/ca/cacert.pem ``` #### 2. 更新代码中的 SSL 上下文逻辑 ```python # 替换原来的 context 创建部分为: ca_cert_path = os.path.join(os.getcwd(), "certs", "cacert.pem") context = ssl.create_default_context() if os.path.isfile(ca_cert_path): context.load_verify_locations(cafile=ca_cert_path) else: print(f"Warning: CA certificate not found at {ca_cert_path}, using default certs.") # 不额外 load,直接使用 create_default_context() 的默认行为(已包含系统证书) ``` > ⚠️ 注意:不要设 `context=None`,否则传给 `urlopen` 会出错! --- ### ✅ 方案三:临时绕过 SSL 验证(仅用于测试!禁止生产环境) ⚠️ 安全风险高,仅用于调试网络是否通: ```python import ssl # ... context = ssl._create_unverified_context() # 忽略证书验证 ``` 然后传这个 context。但这会让中间人攻击成为可能,**切勿用于正式发布版本**。 --- ## 🛠 排查建议清单 | 检查项 | 操作 | |-------|------| | 1. `certs/cacert.pem` 是否存在? | `os.path.isfile("certs/cacert.pem")` 打印确认 | | 2. 是否可以从浏览器打开那个失败的 URL? | 是 → 说明不是权限问题;否 → 可能是预签名链接过期 | | 3. 失败的 URL 是否每次都能复现? | 如果偶尔失败 → 网络波动;总是失败 → SSL 或权限问题 | | 4. Jenkins 环境是否有完整的证书库? | 特别是 Windows 上某些精简版 Python 缺少证书 | --- ## 💡 建议增强功能(加分项) ```python # 在 model_name 中过滤非法字符(Windows 文件名限制) import re safe_model_name = re.sub(r'[<>:"/\\|?*]', '_', model_name) ``` ```python # 自动判断扩展名(根据 Content-Type) ext = { 'image/jpeg': '.jpg', 'image/png': '.png', 'image/gif': '.gif' }.get(resp.getheader('Content-Type', '').lower(), '.png') ``` --- ## ✅ 总结 你现在的问题本质是: > 🔴 **缺少 CA 证书文件 → 导致 SSL 验证失败 → 下载中断** ✅ 最佳解决路径: 1. 👉 将 [https://curl.se/ca/cacert.pem](https://curl.se/ca/cacert.pem) 下载到 `./certs/cacert.pem` 2. 或者 👉 改用 `requests` 库自动管理证书 3. 并确保 `save_path` 目录自动创建(你已经做了) --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值