#证书 #x509 #扩展 #签名 #der #ca #解码

simple_x509

一个简单的X509创建库

12个版本 (3个稳定版本)

1.1.0 2023年1月30日
1.0.1 2023年1月30日
0.2.2 2021年6月3日
0.1.5 2021年5月28日
0.1.1 2021年4月29日

#810 in 编码

Download history 31/week @ 2024-03-13 2/week @ 2024-03-27 3/week @ 2024-04-03 33/week @ 2024-05-08 123/week @ 2024-05-15 108/week @ 2024-05-22 75/week @ 2024-05-29 75/week @ 2024-06-05 55/week @ 2024-06-12 18/week @ 2024-06-19 18/week @ 2024-06-26

每月下载 177
rust-ipfs 中使用

ISC 许可证

36KB
937

概述

这是一个用于创建和解析X509证书的简单库。

功能特点

  • 构建X509证书
  • 将证书编码为DER格式
  • 使用外部加密函数进行签名
  • 从DER格式解码X509证书
  • 使用外部加密函数进行验证
  • 常用扩展的编码/解码操作

使用方法

创建并验证自签名CA证书

use simple_x509::*;

fn sign_fn(data: &Vec<u8>, sign_key: &Vec<u8>) -> Option<Vec<u8>> {
    // Signing implementation
}

fn verify_fn(pub_key: &Vec<u8>, data: &Vec<u8>, sign: &Vec<u8>) -> Option<bool> {
    // Verify implementation
}

fn main() {
    let country = "AU";
    let state = "Some-State";
    let organization = "Internet Widgits Pty Ltd";

    // Load Public Key
    let pub_key = std::fs::read("rsa_pub.der").unwrap();

    // Build X509 structure
    let x = X509Builder::new(vec![0xf2, 0xf9, 0xd8, 0x03]) /* SerialNumber */
        .version(2)
        .issuer_prstr(vec![2, 5, 4, 6], country) /* countryName */
        .issuer_utf8(vec![2, 5, 4, 8], state) /* stateOrProvinceName */
        .issuer_utf8(vec![2, 5, 4, 10], organization) /* organizationName */
        .subject_prstr(vec![2, 5, 4, 6], country) /* countryName */
        .subject_utf8(vec![2, 5, 4, 8], state) /* stateOrProvinceName */
        .subject_utf8(vec![2, 5, 4, 10], organization) /* organizationName */
        .not_before_utc(1_619_014_703)
        .not_after_utc(1_650_550_703)
        .pub_key_der(&pub_key)
        .sign_oid(vec![1, 2, 840, 113549, 1, 1, 11]) /* sha256WithRSAEncryption */
        .build();

    // Load Signing Key
    let sign_key = std::fs::read("rsa.pkcs8").unwrap();

    // Signing a certificate with external function
    let cert = x.sign(sign_fn, &sign_key).unwrap());

    // Encode to DER format
    let der = cert.x509_enc().unwrap());

    // Decode
    let x2 = der.x509_dec().unwrap());

    // Getting Public Key in DER format from certificate
    let pub_key2 = x2.pub_key().unwrap();

    // Verify signature with external function
    let res = x2.verify(verify_fn, &pub_key2);
}

依赖关系

~1.6–2.3MB
~45K SLoC