reqwest请求自签名本地CA服务报CAUsedAsEndEntity错误该如何解决?
问题根因
你当前直接将CA根证书作为HTTPS服务端的终端实体证书部署使用,该证书的X509v3扩展中明确标记了CA:TRUE,密钥用途仅为Certificate Sign, CRL Sign,这类证书只能用于签发下级证书,不能直接作为服务端证书对外提供HTTPS服务,因此客户端校验时会抛出CAUsedAsEndEntity错误。
方案1:临时绕过报错(仅测试环境使用)
你可以在构造reqwest客户端时关闭证书合法性校验,代码示例:
let client = reqwest::Client::builder() .danger_accept_invalid_certs(true) .build()?;
注意:该配置会跳过所有证书合法性校验,存在中间人攻击风险,绝对不能用于生产环境。
方案2:重新签发证书彻底解决问题
你需要使用现有自签名CA签发一张专门用于服务端的终端实体证书,操作步骤如下:
- 生成服务端证书的私钥和CSR(证书签名请求):
- 生成服务端私钥:
openssl genrsa -out server.key 2048 - 生成CSR,Common Name填写你的服务域名
testserver.com:openssl req -new -key server.key -out server.csr
- 新建服务端证书扩展配置文件
server.ext,内容如下:
basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = DNS:testserver.com
- 用现有CA根证书和私钥签发服务端证书:
openssl x509 -req -in server.csr -CA 你的CA证书路径.crt -CAkey 你的CA私钥路径.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile server.ext
- 替换服务端部署的证书:将新生成的
server.crt和server.key替换当前服务使用的CA证书及对应密钥 - (可选)客户端添加CA信任:如果不需要跳过证书校验,可将自签名CA证书添加到Ubuntu系统信任库,reqwest会默认读取系统信任列表完成校验:
- 将CA证书复制到系统信任目录:
sudo cp 你的CA证书路径.crt /usr/local/share/ca-certificates/ - 执行更新信任库命令:
sudo update-ca-certificates
内容的提问来源于stack exchange,提问作者Mnemosyne
相关产品推荐
相关产品推荐

