我正在使用以下堆栈创建应用程序:
在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] 所以我做了一些更多的故障排除:
似乎即使curl工作正常,python本身也会抛出SSL错误。 现在问题可能是,如何使用python处理SSL错误!
答案 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