我一直在通过 nginx 代理为自己运行一个 api,直到今天我重新颁发了它的证书时,我还没有遇到任何问题。证书来自 Let's Encrypt,我制作了我给 nginx捆绑的客户端、中间证书和根证书的文件。
我可以在浏览器中没有警告的情况下很好地访问 api,但是在节点中,我得到了UNABLE_TO_VERIFY_LEAF_SIGNATURE
,在 python 中,Cannot connect to host api.furry.bot:443 ssl:None [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)]
用于 ssl 的 Nginx 配置:
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl_certificate /etc/ssl/main.chained.crt;
ssl_certificate_key /etc/ssl/main.key;
ssl_ciphers HIGH:!aNULL:!MD5;
密钥与链中第一个证书匹配,文件为结构化
服务器证书
中间证书
根证书
我无法让它正常工作,我不想只是在我的节点应用程序中禁用 ssl 验证,也无法正确编辑 python 实现,我感觉它没有获得中间证书和根证书正确,但我不知道。
nginx 代理的服务器是 node express 服务器和一个烧瓶服务器(与此无关)。
相关站点的配置是(所有其他配置基本相同,当然减去 default_server):
server {
listen 443 default_server ssl;
listen [::]:443 default_server ipv6only=on ssl;
server_name furry.bot *.furry.bot;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
ssl 完全在 nginx 端,幕后的一切都是 http。
此错误仅出现在它们通常运行的 Ubuntu 服务器上,它运行良好,在我的本地 Windows 笔记本电脑上没有错误。
(不要这样做。)
我暂时把
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
虽然我知道这是一个坏主意,但我目前没有任何其他选择。
我最终解决这个问题的方法是将我的个人证书与证书颁发机构的中间证书链接起来。(我之前按错了顺序)
例如,我有我的网站证书和中间证书。因此,我通过将站点放在中间站点上,将
它们连接成一个链式证书,就像这样,现在没有
UNABLE_TO_VERIFY_LEAF_SIGNATURE
错误。