我一直在通过 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;
虽然我知道这是一个坏主意,但此刻我没有其他选择。