从 api 获取时,节点抛出“无法验证第一个证书”错误

从 api 获取时,节点抛出“无法验证第一个证书”错误

我一直在通过 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)]

Nginx 的 SSL 配置:

##
# 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 代理的服务器是节点快速服务器和一个 flask 服务器(与此无关)。

所讨论站点的配置是(当然,除了 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;

虽然我知道这是一个坏主意,但此刻我没有其他选择。

答案1

我最终解决这个问题的方法是将我的个人证书与证书颁发机构的中间证书链接起来。(我之前按错了顺序)

例如,我有我的站点证书,以及中级证书

所以我把它们连成一个链式通过将站点放在中间进行认证,就像这样,现在没有UNABLE_TO_VERIFY_LEAF_SIGNATURE错误。

相关内容