Soulter / AstrBot

QQ、Telegram等多平台兼容的支持 LLM 聊天的机器人平台。支持自定义插件扩展。
GNU Affero General Public License v3.0
608 stars 59 forks source link

下载图片时产生SSL错误 #196

Closed bcuiwikb closed 2 months ago

bcuiwikb commented 2 months ago

发生了什么

下载图片时产生SSL错误 类似的事情在Lagrange已修复 https://github.com/LagrangeDev/Lagrange.Core/issues/315

如何复现?

@bot发送图片即可

AstrBot 版本与部署方式

3.3.10 命令行 linux

操作系统

Linux

额外信息

2024-08-23 13:49:59.455| ERROR |MainThread|astrbot.handle|handler.py:202 - Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 1080, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs, sock=sock) File "/usr/lib/python3.10/asyncio/base_events.py", line 1103, in create_connection transport, protocol = await self._create_connection_transport( File "/usr/lib/python3.10/asyncio/base_events.py", line 1133, in _create_connection_transport await waiter File "/usr/lib/python3.10/asyncio/sslproto.py", line 534, in data_received ssldata, appdata = self._sslpipe.feed_ssldata(data) File "/usr/lib/python3.10/asyncio/sslproto.py", line 188, in feed_ssldata self._sslobj.do_handshake() File "/usr/lib/python3.10/ssl.py", line 975, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1007)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/root/AstrBot/astrbot/message/handler.py", line 196, in handle llm_result = await provider.text_chat( File "/root/AstrBot/model/provider/openai_official.py", line 322, in text_chat await self.assemble_context(session_id, prompt, image_url) File "/root/AstrBot/model/provider/openai_official.py", line 225, in assemble_context "url": await self.encode_image_bs64(image_url) File "/root/AstrBot/model/provider/openai_official.py", line 156, in encode_image_bs64 image_url = await download_image_by_url(image_url) File "/root/AstrBot/util/io.py", line 99, in download_image_by_url async with session.get(url, ssl=ssl_context) as resp: File "/usr/local/lib/python3.10/dist-packages/aiohttp/client.py", line 657, in _request conn = await self._connector.connect( File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 564, in connect proto = await self._create_connection(req, traces, timeout) File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 975, in _createconnection , proto = await self._create_direct_connection(req, traces, timeout) File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 1350, in _create_direct_connection raise last_exc File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 1319, in _create_direct_connection transp, proto = await self._wrap_create_connection( File "/usr/local/lib/python3.10/dist-packages/aiohttp/connector.py", line 1084, in _wrap_create_connection raise ClientConnectorSSLError(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorSSLError: Cannot connect to host multimedia.nt.qq.com.cn:443 ssl:<ssl.SSLContext object at 0x7fa4575efe40> [[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1007)]

2024-08-23 13:49:59.455| ERROR |MainThread|astrbot.handle|handler.py:203 - LLM 调用失败。

你愿意提交 PR 吗?

Code of Conduct

Soulter commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: https://github.com/LagrangeDev/Lagrange.Core/issues/315#issuecomment-2150276058

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

bcuiwikb commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: https://github.com/LagrangeDev/Lagrange.Core/issues/315#issuecomment-2150276058

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容

('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

bcuiwikb commented 2 months ago

补一脚 我之前说的不太清楚 我的系统是ubuntu22.04

Soulter commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: LagrangeDev/Lagrange.Core#315 (comment)

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容

('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

没事没事。可以试着把 https://github.com/Soulter/AstrBot/blob/master/util/io.py#L92-L93 这两行改成 context.set_ciphers('AES') 我感觉这样就行了。

bcuiwikb commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: LagrangeDev/Lagrange.Core#315 (comment)

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容

('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

没事没事。可以试着把 https://github.com/Soulter/AstrBot/blob/master/util/io.py#L92-L93 这两行改成 context.set_ciphers('AES') 我感觉这样就行了。

谢谢 我看看

bcuiwikb commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: LagrangeDev/Lagrange.Core#315 (comment)

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容

('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

没事没事。可以试着把 https://github.com/Soulter/AstrBot/blob/master/util/io.py#L92-L93 这两行改成 context.set_ciphers('AES') 我感觉这样就行了。

我怎么感觉 我好像搞错了 改了之后日志消息变成了这个 Screenshot_20240826_210353.jpg 我在外面 只能用手机了 你忍着看看 大致是 name 'context' is not defined

Soulter commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: LagrangeDev/Lagrange.Core#315 (comment)

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容 ('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

没事没事。可以试着把 https://github.com/Soulter/AstrBot/blob/master/util/io.py#L92-L93 这两行改成 context.set_ciphers('AES') 我感觉这样就行了。

我怎么感觉 我好像搞错了 改了之后日志消息变成了这个 Screenshot_20240826_210353.jpg 我在外面 只能用手机了 你忍着看看 大致是 name 'context' is not defined

打错了,应该是 ssl_context.set_ciphers('AES')

bcuiwikb commented 2 months ago

这个是个 SSL 证书验证问题,我在我的 Linux 和 MaxOS 上没复现这个问题,估计和 OS 有关。

 2024-08-23 07:20:57.434| INFO     |MainThread|astrbot.download_image_by_url|io.py:81 - 下载图片: https://multimedia.nt.qq.com.cn/
 2024-08-23 07:20:58.020| INFO     |MainThread|astrbot.save_temp_img|io.py:73 - 保存临时图片: temp/1724412058.jpg

可以试一下在你的机器上执行这段代码: LagrangeDev/Lagrange.Core#315 (comment)

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

看看输出什么

输出了以下内容 ('AES128-GCM-SHA256', 'TLSv1.2', 128) TLSv1.2 还有就是我现在才看到 对不起

没事没事。可以试着把 https://github.com/Soulter/AstrBot/blob/master/util/io.py#L92-L93 这两行改成 context.set_ciphers('AES') 我感觉这样就行了。

我怎么感觉 我好像搞错了 改了之后日志消息变成了这个 Screenshot_20240826_210353.jpg 我在外面 只能用手机了 你忍着看看 大致是 name 'context' is not defined

打错了,应该是 ssl_context.set_ciphers('AES')

收到 谢谢

bcuiwikb commented 2 months ago

等一下 他还是没找到name 'ssl_context' 是不是没安装包

Soulter commented 2 months ago

QQ_1724677953540

这是个变量

bcuiwikb commented 2 months ago

是我配置错了吗Screenshot_20240826_211629.jpg

bcuiwikb commented 2 months ago

我想我不小心把变量删了

Soulter commented 2 months ago

加上这一行

ssl_context = ssl.create_default_context()

删掉 xxxx=ssl.CERT_NONE 一行

bcuiwikb commented 2 months ago

谢谢了 我想这个议题可以close了