#证书 #私钥 #CA #PEM #签名 #服务器 #生成

certgenutil

生成自签名证书,创建由证书颁发机构(CA)签名的服务器证书

1 个不稳定版本

0.1.1 2024年8月18日
0.1.0 2024年8月18日

#1835 in 加密学

Download history 169/week @ 2024-08-12

169 每月下载量

MIT 许可证

32KB
292 代码行

certgenutil

生成自签名证书,创建由证书颁发机构(CA)签名的服务器证书


lib.rs:

证书生成和处理库

这个 Rust 库提供生成自签名证书、创建由证书颁发机构(CA)签名的服务器证书以及处理证书加载和保存操作的功能。它利用 rustls_pki_typesrcgenpem 包来实现这些任务。

特性

  • 自签名证书生成:创建具有指定参数的自签名证书。
  • 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