1 个不稳定版本
新 0.1.1 | 2024年8月18日 |
---|---|
0.1.0 |
|
#1835 in 加密学
169 每月下载量
32KB
292 代码行
certgenutil
生成自签名证书,创建由证书颁发机构(CA)签名的服务器证书
lib.rs
:
证书生成和处理库
这个 Rust 库提供生成自签名证书、创建由证书颁发机构(CA)签名的服务器证书以及处理证书加载和保存操作的功能。它利用 rustls_pki_types
、rcgen
和 pem
包来实现这些任务。
特性
- 自签名证书生成:创建具有指定参数的自签名证书。
- CA 签名证书生成:生成由 CA 证书签名的服务器证书。
- 证书加载:从 PEM 文件或 PEM 格式的字符串中加载证书和私钥。
- 证书保存:将证书和私钥转换为 PEM 格式以进行存储或传输。
错误处理
库定义了一个 CertGenError
枚举,用于表示在处理证书时可能发生的各种错误,包括 I/O 错误、生成失败、解析错误和其他杂项错误。
用法
生成自签名 CA 证书
use certgenutil::generate_self_signed_cert;
let (cert, private_key) = generate_self_signed_cert(
"example.com",
true,
365,
vec!["www.example.com".to_string(), "mail.example.com".to_string()],
).unwrap();
生成由 CA 签名的服务器证书
使用 CA 证书文件
use certgenutil::generate_server_cert_by_ca_file;
use std::path::PathBuf;
let ca_file_path = PathBuf::from("ca.pem");
let (cert, private_key) = generate_server_cert_by_ca_file(
ca_file_path,
"example.com",
365,
vec!["www.example.com".to_string(), "mail.example.com".to_string()],
).unwrap();
使用 CA 证书 PEM 字符串
use certgenutil::generate_server_cert_by_ca_pem;
let ca_pem = String::from(r#"-----BEGIN CERTIFICATE-----
MIIBejCCASCgAwIBAgIUNcB9KoFex2HVOvNXIZzfN/7QyMUwCgYIKoZIzj0EAwIw
ETEPMA0GA1UEAwwGcm9vdGNhMB4XDTI0MDgxODA0NDEwOFoXDTI1MDgxODA0NDEw
OFowETEPMA0GA1UEAwwGcm9vdGNhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
0kzg73SoZ82snyWboqjKbrlgvavvzduYSWmn2x6NBejWlPLLxdtMxiY0NVfSXq+I
9eBqzr88yV7QC79yH+GxyKNWMFQwEgYDVR0RBAswCYIHYWJjLmNvbTAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFP/KV01ye89Wwfde0wic7i+StpidMA8GA1UdEwEB
/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgfQlSU05caJtz8XxJvA/AmHSQkroy
YUloxc/s1mQKR9ICIQD9twx295ClByM7bjsHsGNnORok3szuCuJiQaX9o5DR1w==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgSnXLALeEZnbLdbRT
T4IumE9TztYMJTF97pMQFpF0zByhRANCAATSTODvdKhnzayfJZuiqMpuuWC9q+/N
25hJaafbHo0F6NaU8svF20zGJjQ1V9Jer4j14GrOvzzJXtALv3If4bHI
-----END PRIVATE KEY-----"#);
let (cert, private_key) = generate_server_cert_by_ca_pem(
ca_pem,
"example.com",
365,
vec!["www.example.com".to_string(), "mail.example.com".to_string()],
).unwrap();
加载证书和私钥
从 PEM 文件
use certgenutil::{load_cert_from_pem_file, load_key_from_pem_file};
use std::path::PathBuf;
let cert_path = PathBuf::from("ca.pem");
let key_path = PathBuf::from("ca.pem");
let cert = load_cert_from_pem_file(cert_path).unwrap();
let key = load_key_from_pem_file(key_path).unwrap();
从 PEM 字符串
use certgenutil::{load_cert_from_pem_str, load_key_from_pem_str};
let cert_pem = r#"-----BEGIN CERTIFICATE-----
MIIBejCCASCgAwIBAgIUBH8zfLAlg0h8FQUc8wZjJlrPWrgwCgYIKoZIzj0EAwIw
ETEPMA0GA1UEAwwGcm9vdGNhMB4XDTI0MDgxODA0MzMxMFoXDTI1MDgxODA0MzMx
MFowETEPMA0GA1UEAwwGcm9vdGNhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
8GuAphYzDWDsTbuXaQcZt28NAgVJJC2RRj+h76CtfpIH/VonRCEBsRtS6UOWXvi9
QX7bO+evfMFvpyJq7IE9KaNWMFQwEgYDVR0RBAswCYIHYWJjLmNvbTAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFPK0E8CY4Hv2FQurWHogzHeXWIYWMA8GA1UdEwEB
/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKvhoh2oz+WZ3Ry0du8saLwqAFBz
Kdpn9dwKE0NF3Ju9AiAs2ZO7fDaMxEkeFIqZi1XktTNWOzSMrjuZDknC2tZugQ==
-----END CERTIFICATE-----"#;
let key_pem = r#"-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgPY2goeIEayj3JLGR
/eRUTD7CAevRscPGxSWAbcWOpYChRANCAATwa4CmFjMNYOxNu5dpBxm3bw0CBUkk
LZFGP6HvoK1+kgf9WidEIQGxG1LpQ5Ze+L1Bfts75698wW+nImrsgT0p
-----END PRIVATE KEY-----"#;
let cert = load_cert_from_pem_str(cert_pem).unwrap();
let key = load_key_from_pem_str(key_pem).unwrap();
转换为 PEM 格式
use certgenutil::{get_cert_pem, get_key_pem,load_cert_from_pem_file,load_key_from_pem_file};
let cert = load_cert_from_pem_file("ca.pem").unwrap();
let key = load_key_from_pem_file("ca.pem").unwrap();
let cert_pem = get_cert_pem(&cert);
let key_pem = get_key_pem(&key).unwrap();
依赖项
rustls_pki_types
rcgen
pem
thiserror
许可证
此库采用 MIT 许可证。有关详细信息,请参阅许可证文件。
贡献
欢迎贡献!请在此GitHub 仓库上打开问题或提交拉取请求。
联系方式
有关问题或支持,请联系 [email protected]。
依赖项
~66MB
~1.5M SLoC