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

时间:2018-04-20 19:19:40

标签: docker nginx flask ssl-certificate uwsgi

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

  • Python 3.6 + Flask
  • uwsgi
  • Nginx的

在Docker容器内执行。 该应用程序依次调用Jira API来收集和操作数据。大多数入站应用程序都运行良好。但是,当应用程序尝试调用Jira API时,它会抛出以下错误: [SSL:CERTIFICATE_VERIFY_FAILED]

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

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

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

[edit] 添加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直接调用它进行调试

[EDIT2] 所以我做了一些更多的故障排除:

  1. 创建了一个简单的脚本,它只是调用Jira url
  2. 使用 python3 [scriptname] 在我的本地(mac os)中运行脚本。这很好用并打印了200 OK
  3. 将同一个文件复制到我的容器中并运行相同的代码。
  4. 得到同样的问题。
  5. 使用与CURL相同的URL,它得到了响应。
  6. 似乎即使curl工作正常,python本身也会抛出SSL错误。 现在问题可能是,如何使用python处理SSL错误!

2 个答案:

答案 0 :(得分:1)

我终于能够解决这个问题了。该问题与代码发出的请求调用有关。 默认情况下,请求调用已将verify设置为true。此外,请求使用内置证书进行验证。 就我而言,由于我使用的是自定义证书,因此请求无法验证Jira网站。 为了解决这个问题,我在docker文件中创建了一个ENV变量,并指向请求以引用我的image&#39s的certs目录。 确切的行

ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/

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

答案 1 :(得分:0)

当 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