LDAP作为证书权威时Nginx Docker出现err_cert_authority_invalid问题求助
我正在搭建一个受限访问互联网的封闭网络系统,使用Nginx Docker处理SSL。系统自有Certificate Authority,提交证书签名请求并获取到证书后,将证书和密钥配置到Nginx中,服务端可正常返回证书,但客户端出现err_cert_authority_invalid错误(见截图)。查看证书的CA URI为LDAP地址ldap://{ldap stuff},我可通过该地址执行LDAP搜索获取cACertificate。此前未接触过以LDAP字符串作为证书权威的情况,推测可能需要在运行Nginx的Docker中安装LDAP客户端来解析CA,或是需将搜索到的证书安装到系统中,现寻求解决方案。
Nginx配置
server { listen 443 default_server ssl ipv6only=off; server_name some.thing.edu; ssl_certificate /etc/ssl/certs/sigend.crt; ssl_certificate_key /etc/ssl/private/private.key; location / { proxy_pass http://app_web; proxy_redirect off; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $server_name; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } }
错误截图

解决方案
1. 提取CA证书并配置完整证书链
浏览器/客户端不会自动通过LDAP地址拉取CA证书,这是问题核心。需要先获取CA证书,让Nginx返回完整的信任链:
从LDAP提取CA证书
先安装ldap-utils(本地或Docker容器内),执行命令:ldapsearch -x -H ldap://{ldap stuff} -b "cn=你的CA条目DN" cACertificate | grep -v "^#" | grep -v "^dn:" | base64 -d > ca.crt替换命令中的
{ldap stuff}和cn=你的CA条目DN为实际LDAP地址与CA条目标识。合并证书并修改Nginx配置
将服务器证书与CA证书合并成完整链:cat sigend.crt ca.crt > fullchain.crt修改Nginx配置中的证书路径:
ssl_certificate /etc/ssl/certs/fullchain.crt;重启Nginx后,服务端会同时返回服务器证书和CA根证书,客户端可完成信任链验证。
2. 客户端直接信任CA证书
如果无法修改Nginx配置,可将提取到的ca.crt安装到客户端信任存储:
- Linux:将证书复制到
/usr/local/share/ca-certificates/,执行update-ca-certificates - Windows:双击证书文件,选择“安装证书”,存入“受信任的根证书颁发机构”
- 浏览器:在证书设置中导入CA证书到信任根目录
3. (可选)Docker容器内安装LDAP工具
若需要在容器内调试LDAP操作,可自定义Nginx镜像:
创建Dockerfile:
FROM nginx:latest RUN apt-get update && apt-get install -y ldap-utils && rm -rf /var/lib/apt/lists/*
构建镜像后运行,容器内即可使用ldapsearch等工具,但这仅用于调试,无法直接解决客户端信任问题。
内容的提问来源于stack exchange,提问作者nemisis enforcer

