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

如何在Rust中不依赖OpenSSL生成等效的PKCS#10 CSR?

使用Rust实现与OpenSSL命令等效的CSR生成

Rust的加密生态已经足够成熟,完全可以不依赖OpenSSL工具生成与你给出的命令相同的输出——包括2048位RSA私钥和对应的证书签名请求(CSR)。下面是完整的实现方案:

第一步:配置依赖

确保你的Cargo.toml包含以下依赖(版本可根据最新稳定版调整):

[dependencies]
rsa = { version = "0.9", features = ["pkcs1", "pem"] }
rcgen = "0.11"
rand = "0.8"
pkcs8 = "0.10"

完整实现代码

use rsa::{RsaPrivateKey, pkcs1::{EncodeRsaPrivateKey, LineEnding}};
use rcgen::{CertificateSigningRequest, DistinguishedName, DnType};
use std::path::Path;
use rand::thread_rng;
use pkcs8::EncodePrivateKey;

fn main() {
    // 生成2048位RSA私钥
    let mut rng = thread_rng();
    let bits = 2048;
    let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("生成RSA密钥失败");

    // 将RSA私钥转换为rcgen兼容的PKCS#8格式
    let pkcs8_key = priv_key.to_pkcs8_pem(LineEnding::LF).expect("转换密钥格式失败");
    let rcgen_key = rcgen::KeyPair::from_pem(&pkcs8_key).expect("加载密钥到rcgen失败");

    // 构建CSR主题信息(完全对应OpenSSL命令的-subj参数)
    let mut dn = DistinguishedName::new();
    dn.push(DnType::CountryName, "US");
    dn.push(DnType::StateOrProvinceName, "Utah");
    dn.push(DnType::LocalityName, "Salt Lake City");
    dn.push(DnType::OrganizationName, "Xmpl, Inc.");
    dn.push(DnType::OrganizationalUnitName, "IT Department");
    dn.push(DnType::CommonName, "www.example.com");
    dn.push(DnType::EmailAddress, "admin@example.com");

    // 生成并序列化CSR
    let csr = CertificateSigningRequest::from_params(dn, &rcgen_key).expect("生成CSR失败");
    let csr_pem = csr.serialize_pem().expect("序列化CSR为PEM失败");

    // 导出私钥到文件(与OpenSSL -nodes生成的PKCS#1格式一致)
    priv_key.write_pkcs1_pem_file(Path::new("www_example_com.key"), LineEnding::LF)
        .expect("写入私钥文件失败");

    // 导出CSR到文件
    std::fs::write("www_example_com.csr", csr_pem)
        .expect("写入CSR文件失败");

    println!("已生成{}位RSA私钥和对应的CSR", bits);
}

关键细节说明

  • 密钥格式转换:rcgen默认使用PKCS#8格式密钥,而rsa库生成的是PKCS#1格式,因此需要先完成格式转换才能被rcgen识别。
  • 主题信息匹配:通过DistinguishedName逐一添加-subj中的字段,确保生成的CSR主题与OpenSSL命令输出完全一致。
  • 格式兼容性:生成的私钥和CSR均为PEM格式,与OpenSSL命令的输出完全兼容,可直接用OpenSSL工具验证。

验证一致性

你可以用以下OpenSSL命令验证生成的文件:

# 检查私钥有效性
openssl rsa -in www_example_com.key -check

# 解析CSR内容,对比主题信息
openssl req -in www_example_com.csr -noout -text

内容的提问来源于stack exchange,提问作者suchislife801

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:53:16