Docker 容器中的 Nginx、uwsgi 和 flask 应用生成 [SSL: CERTIFICATE_VERIFY_FAILED]

Nginx, uwsgi and flask app in Docker container generating [SSL: CERTIFICATE_VERIFY_FAILED]

我正在使用以下堆栈创建应用程序:

在 Docker 容器内执行。 此应用程序依次调用 Jira API 来收集和操作数据。 Most 的应用程序入站工作正常。但是,当应用程序尝试调用 Jira API 时,它会抛出以下错误: [SSL: CERTIFICATE_VERIFY_FAILED]

我认为,此问题的发生是由于链中存在自签名证书(这是不可避免的)。 我确实将证书导入 docker 图像并且 curl 命令工作正常(最初 curl 也抛出不安全警告)。

此外,为了隔离问题,我关闭了 nginx 并直接使用 uwsgi 启动了应用程序(uwsgi --socket 0.0.0.0:8080 --protocol=http -w [module] :[app]) 并在 uwsgi 控制台中看到同样的错误。

这是否意味着我需要将 SSL 证书导入到 uwsgi 中? 如果是这样,究竟该怎么做。我不打算使用自己的证书或密钥来确保我的应用程序安全。 如果我纯粹 运行 没有任何 uwsgi、nginx 和 docker.

的烧瓶应用程序,这个程序就可以工作

[编辑] 添加 Nginx 配置

server {
    listen 8080;
    location / {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
    location = / {
        index /static/index.html;
    }
} 

uwsgi-使用CLI调试直接调用

[编辑2] 所以我做了更多的故障排除:

  1. 创建了一个简单的脚本,它只是调用 Jira url
  2. 运行 我本地 (mac os) 中的脚本使用 python3 [scriptname]。这工作正常并打印了 200 OK
  3. 将相同的文件复制到我的容器中并运行相同的代码。
  4. 遇到了同样的问题。
  5. 使用与 CURL 相同的 URL 并得到响应。

似乎即使 curl 工作正常,python 本身也会抛出 SSL 错误。 所以现在的问题可能是,如何使用 python !?

处理 SSL 错误

我终于能够解决这个问题。该问题与代码进行的 request 调用有关。 默认情况下,request 调用将验证设置为 true。此外,请求使用内置证书进行验证。 就我而言,由于我使用的是自定义证书,请求无法验证 Jira 站点。 为了解决这个问题,我在 docker 文件中创建了一个 ENV 变量,并将 request 指向我的图像的 certs 目录。 精确行

ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/

请注意,自定义证书仍需要在构建期间导入到 docker 映像中。

当 crt 或 pem 文件不是捆绑证书文件时,也会发生此错误。

要打包,请发出此命令:

openssl pkcs12 -in my_certificate.pfx -nodes -nokeys -out server-bundle.pem

如果您还需要服务器密钥,请发出:

openssl pkcs12 -in my_certificate.pfx -nocerts -nodes -out  server.key

并更新 apache 或 nginx 配置文件上的 SSL 证书条目并重新启动,然后验证:

http https://yourdomain.com

http --debug -j --verify server-bundle.pem https://yourdomain.com