You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:22:25