Docker容器无法向外部API发送HTTPS请求
我最近在做一个Python的Discord机器人,想把它放到容器里,结果还挺顺利的。不过在测试一个功能(机器人通过HTTPS调用开放API)的时候,使用http3这个包时遇到了一个错误:
ssl.SSLError: Cannot create a client socket with a PROTOCOL_TLS_SERVER context (_ssl.c:811)
我在网上看了很多文章和教程,但要么是半吊子的回答,要么是和我问题不太相关的内容,比如配置Nginx,这让我觉得有点混淆。
到目前为止,我看到有人提到要创建并移动一些证书,还有一个回答说要在Dockerfile
里加上--network host
,但我觉得网络连接本身应该没问题。
我一度想把请求的URL改成HTTP,因为没有传输任何凭证或敏感数据,但我还是觉得用HTTPS会让我更安心。
我的Dockerfile如下(注意:我在调查后加了RUN apt-get update ...
这一块,希望能生成一个证书,结果错误并没有消失)。
FROM python:3.10-bullseye
COPY requirements.txt /app/
COPY ./bot/ /app
RUN apt-get update \
&& apt-get install openssl \
&& apt-get install ca-certificates
RUN update-ca-certificates
WORKDIR /app
RUN pip install -r requirements.txt
COPY . .
CMD ["python3", "-u", "v1.py"]
我在容器里做了一些基本的诊断,比如检查证书的目录,试着用curl访问一个HTTPS的URL。
1 个回答
-1
更新:可能这是这个软件包里的一个 bug,但出于好奇,我把原来的 REST API 客户端换成了 asyncio 和 aiohttp,而不是用 http3,然后重新尝试了一下请求,结果一切都正常。所以如果有人遇到同样的问题,可以试试这个方法。