Alpine 3.14上Nodejs应用axios调用HTTPS遇Letsencrypt证书过期报错求助
解决方案
步骤1:更新Alpine系统CA证书并移除过期根证书
你可以直接在运行中的容器执行以下命令,也可以将命令添加到Dockerfile中固化配置:
apk update && apk upgrade -y ca-certificates sed -i '/DST_Root_CA_X3.crt/d' /etc/ca-certificates.conf update-ca-certificates
Dockerfile写法示例:
RUN apk update && apk upgrade -y ca-certificates \ && sed -i '/DST_Root_CA_X3.crt/d' /etc/ca-certificates.conf \ && update-ca-certificates
步骤2:配置Node.js读取系统CA证书
Node.js默认优先使用自身内置的根证书列表,不会主动读取系统CA存储,这是你修改系统证书后仍然报错的核心原因。
启动Node应用前添加以下环境变量即可修复:
export NODE_OPTIONS=--use-openssl-ca
Dockerfile全局配置写法:
ENV NODE_OPTIONS="--use-openssl-ca"
步骤3:axios专属适配配置(可选,仅前两步不生效时使用)
如果配置完上述内容仍然报错,可以在axios初始化时显式指定读取系统CA证书:
const https = require('https') const fs = require('fs') const axios = require('axios').default.create({ httpsAgent: new https.Agent({ ca: fs.readFileSync('/etc/ssl/certs/ca-certificates.crt') }) })
注意:仅测试场景可以临时添加配置process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'跳过证书校验,生产环境禁止使用该配置。
验证方法
在容器内执行以下命令验证修复结果:node -e "const https = require('https'); https.get('https://valid-isrgrootx1.letsencrypt.org/', (res) => { console.log('修复成功,状态码:', res.statusCode) }).on('error', (e) => { console.error('报错:', e.message) })"
内容的提问来源于stack exchange,提问作者Sagar Kalburgi
相关产品推荐
相关产品推荐

