python-2.7 - 使用 Python 请求 session 时出现 SSL EOF 错误

标签 python-2.7 ssl flask kubernetes python-requests

总结

我使用 python 2.7.12、Flask 0.12.2 和使用请求库将 Flask 应用程序部署到 Kubernetes。使用 requests.session 在容器内发送 POST 请求时出现 SSLError。当使用请求 session 连接到 https url 时,请求会抛出 SSLError

一些背景

  • 我还没有添加任何证书
  • 当我在本地运行 docker 镜像但在部署到 kubernetes 之后,从容器内部运行该项目时,该项目工作 - 发布请求未发送到 url verify=false 也不行

系统信息 - 我正在使用什么: Python 2.7.12, Flask==0.12.2, Kubernetes, python-requests-2.18.4

预期结果

发送POST请求后得到HTTP响应码200

错误日志

r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 511, in send
raise SSLError(e, request=request)
SSLError: HTTPSConnectionPool(host='dev.domain.nl', port=443): Max retries exceeded with url: /ingestion?LrnDevEui=0059AC0000152A03&LrnFPort=1&LrnInfos=TWA_100006356.873.AS-1-135680630&AS_ID=testserver&Time=2018-06-22T11%3A41%3A08.163%2B02%3A00&Token=1765b08354dfdec (Caused by SSLError(SSLEOFError(8, u'EOF occurred in violation of protocol (_ssl.c:661)'),))

/usr/local/lib/python2.7/site-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: 正在发出未经验证的 HTTPS 请求。强烈建议添加证书验证。请参阅:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings 不安全请求警告)

复制步骤

import requests
from flask import Flask, request, jsonify
from requests import Request, Session

sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 200)
sess.mount('http://', adapter)
sess.mount('https://', adapter)
sess.cert ='/usr/local/lib/python2.7/site-packages/certifi/cacert.pem'


def test_post():
    url = 'https://dev.domain.nl/ingestion/?'
    header = {'Content-Type': 'application/json', 'Accept': 'application/json'}
    response = sess.post(url, headers= header, params= somepara, data= json.dumps(data),verify=True)
    print response.status_code
    return response.status_code

def main():
    threading.Timer(10.0, main).start()
    test_post()

if __name__ == '__main__':
    main()
    app.run(host="0.0.0.0", debug=True, port=5001, threaded=True)

码头文件

FROM python:2.7-alpine
COPY ./web /web
WORKDIR /web
RUN pip install -r requirements.txt

ENV FLASK_APP app.py

EXPOSE 5001
EXPOSE 443

CMD ["python", "app.py"]

最佳答案

问题可能出在缺少 CA 证书的 Alpine Docker 镜像中。在您的笔记本电脑上,代码可以正常工作,因为它使用本地工作站的 CA 证书。我认为在本地运行 Docker 镜像也会失败 - 所以问题不在于 k8s。

尝试将以下行添加到 Dockerfile:

RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*

它将在容器内安装 CA 证书。

关于python-2.7 - 使用 Python 请求 session 时出现 SSL EOF 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988075/

相关文章:

ssl - EppLib.net - 使用哪个 SSL 证书

python - 如何通过 AJAX 向 Flask 发送数据?

android - 配置其他库使用的 OkHttpClient 实例

git - push 失败。连接到 github.com 时出现未知 SSL 协议(protocol)错误 :443

python-2.7 - 来自列表理解的Python字符串

Python:无法访问通过多处理更改的内存

python - ImportError ('No module named %s' % fullname) ImportError : No module named flask. ext.wtf.TextField

python - Flask 不会在 POST 方法上重定向

python - 无法在python中访问基类中的父类成员

r - 如何在Python中使用R studio中已有的贝叶斯变化点库作为bcp?