aiohttp 指定 tls 版本 (ssl 错误)

当遇到Python的aiohttp库在访问某些网站时出现SSL错误,原因是服务器仅支持低版本TLS。通过分析curl和openssl的交互,发现服务器响应TLS 1.0,而curl和aiohttp默认不支持不安全的TLS版本。通过指定TLS 1.0,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某些网站对 ssl 1.0 以上的版本支持并不友好,但是 python ssl lib 默认会指定当前OpenSSL支持的最高版本,并且当服务器返回的ssl版本号低于或者等于1.0时, 会出现如下错误

aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host www.mdnkids.com:443 ssl:<ssl.SSLContext object at 0x1096634a8> [None]

看一下错误原因的推断过程,我的操作系统是 Mac OS, 首先用 curl 命令进行尝试

  curl 'https://www.mdnkids.com'
  curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.mdnkids.com:443

 发现 curl 也一样有 ssl error, 那么尝试直接用 openssl 对该域名进行连接

openssl s_client  -connect www.mdnkids.com:443 -msg
# if fail, try openssl s_client -CApath /usr/local/etc/openssl/certs  -connect www.mdnkids.com:443 -msg

==> TLS 1.2 Handshake [length 0139], ClientHello
==> ...
==>  TLS 1.0 Handshake [length 004a], ServerHello
==>  TLS 1.0 Handshake [length 0c0a], Certificate
==> ...
==> TLS 1.0 Handshake [length 0010], Finished

发现,

import contextily as ctx # 导入contextily库用于添加背景地图 import matplotlib.pyplot as plt # 导入matplotlib.pyplot库用于绘图 # 定义经纬度范围 min_lon, max_lon = 121.4800, 121.5050 # 经度范围 min_lat, max_lat = 31.2300, 31.2450 # 纬度范围 # 创建一个几何框表示指定的区域 geometry = box(min_lon, min_lat, max_lon, max_lat) # 使用box函数创建几何框 gdf = gpd.GeoDataFrame({&#39;geometry&#39;: [geometry]}, crs="EPSG:4326") # 创建GeoDataFrame并设置坐标参考系统为WGS 84 # 将坐标系转换为Web Mercator (EPSG:3857)以便与Contextily兼容 gdf_webmercator = gdf.to_crs(epsg=3857) # 转换坐标系为Web Mercator # 设置图形大小 fig, ax = plt.subplots(figsize=(10, 10)) # 创建一个10x10英寸的图形和轴对象 # 绘制几何框 gdf_webmercator.plot(ax=ax, facecolor=&#39;none&#39;, edgecolor=&#39;blue&#39;) # 在轴上绘制几何框,无填充颜色,蓝色边框 # 添加背景地图,并设置超时时间和重试次数 try: ctx.add_basemap(ax, source=ctx.providers.OpenStreetMap.Mapnik, zoom=16) # 添加OpenStreetMap背景地图,最大重试次数为3次 except Exception as e: print(f"Failed to add basemap: {e}") # 捕获异常并打印错误信息 # 打印当前轴的限制以检查是否正确 print("Current axis limits:", ax.get_xlim(), ax.get_ylim()) # 打印当前轴的限制 # 移除轴刻度 ax.set_axis_off() # 关闭轴的刻度显示 # 保存图像 plt.savefig("osm_map_visualization.png", bbox_inches=&#39;tight&#39;, pad_inches=0) # 保存图像到文件,去除周围空白 # 显示图像(可选) plt.show() # 显示图像 图像输出空白,报如下"G:\BaiduSyncdisk\01-Thesis P5-ACO-2\Codes_3D\UAM\envs\Demo_Osm\python.exe" "G:\BaiduSyncdisk\01-Thesis P5-ACO-2\Codes_3D\UAM\CallOsm\VisualizeOsm.py" Failed to add basemap: HTTPSConnectionPool(host=&#39;tile.openstreetmap.org&#39;, port=443): Max retries exceeded with url: /16/54882/26774.png (Caused by ProxyError(&#39;Unable to connect to proxy&#39;, SSLError(SSLZeroReturnError(6, &#39;TLS/SSL connection has been closed (EOF) (_ssl.c:1149)&#39;)))) Current axis limits: (13522952.592203382, 13526013.878200196) (3662557.5374864344, 3664705.745485841) Process finished with exit code 0
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值