如何通过Rust reqwest crate使用系统已安装的自签名证书?
使用reqwest自动加载系统已安装的自签名证书
要让reqwest自动读取系统中安装的自签名证书(包括Windows受信任根存储、macOS钥匙串、Linux系统证书目录中的证书),核心是利用对应TLS后端的系统证书加载能力,分两种场景实现:
方案1:使用native-tls后端(推荐)
reqwest的native-tls特性会直接调用操作系统原生的TLS库(Windows Schannel、macOS Secure Transport、Linux OpenSSL),这些库默认会自动加载系统的根证书存储,其中就包含用户安装的自签名根证书。
步骤1:配置依赖
在Cargo.toml中添加reqwest并启用native-tls特性:
[dependencies] reqwest = { version = "0.11", features = ["native-tls"] } tokio = { version = "1.0", features = ["full"] } # 异步运行时,按需添加
步骤2:编写代码
不需要额外配置证书,直接创建客户端即可:
use reqwest::Client; async fn fetch_self_signed_endpoint() -> Result<(), reqwest::Error> { // 自动使用系统证书存储 let client = Client::new(); let response = client.get("https://your-self-signed-domain.com") .send() .await?; println!("请求状态码: {}", response.status()); Ok(()) }
方案2:使用rustls后端(需手动加载系统证书)
如果因为跨平台一致性等原因必须使用rustls后端,需要借助rustls-native-certs crate主动加载系统根证书,再配置给reqwest。
步骤1:配置依赖
[dependencies] reqwest = { version = "0.11", features = ["rustls-tls"] } rustls-native-certs = "0.6" tokio = { version = "1.0", features = ["full"] } rustls = "0.21"
步骤2:编写代码
手动加载系统证书并构建TLS配置:
use reqwest::Client; use rustls_native_certs::load; use std::sync::Arc; use rustls::{RootCertStore, ClientConfig, Certificate}; async fn fetch_self_signed_endpoint() -> Result<(), reqwest::Error> { // 加载系统所有根证书 let system_certs = load()?; // 构建rustls的根证书存储 let mut root_store = RootCertStore::empty(); for cert in system_certs { root_store.add(&Certificate(cert.0))?; } // 配置TLS客户端 let tls_config = ClientConfig::builder() .with_safe_defaults() .with_root_certificates(root_store) .with_no_client_auth(); // 创建reqwest客户端并应用TLS配置 let client = Client::builder() .use_preconfigured_tls(Arc::new(tls_config)) .build()?; let response = client.get("https://your-self-signed-domain.com") .send() .await?; println!("请求状态码: {}", response.status()); Ok(()) }
注意事项
- 自签名证书必须安装到系统级的受信任根证书颁发机构存储中,而非用户个人存储(部分系统仅读取全局信任的证书)。
- 确保reqwest版本与依赖的TLS相关 crate 版本兼容,避免版本冲突。
内容的提问来源于stack exchange,提问作者Jeon
相关产品推荐
相关产品推荐

