如何在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
相关产品推荐
相关产品推荐

