#证书 #nom #x509 #解析器组合器 #解析器 #签名验证

x509-parser

用于解析X.509 v3格式(RFC 5280证书)的解析器

36次发布

0.16.0 2024年2月29日
0.15.1 2023年8月3日
0.15.0 2023年3月15日
0.14.0 2022年6月30日
0.1.0 2018年1月20日

#6 in 密码学

Download history 250412/week @ 2024-04-23 232520/week @ 2024-04-30 221293/week @ 2024-05-07 259560/week @ 2024-05-14 272028/week @ 2024-05-21 298148/week @ 2024-05-28 285321/week @ 2024-06-04 275297/week @ 2024-06-11 257540/week @ 2024-06-18 276276/week @ 2024-06-25 247895/week @ 2024-07-02 285663/week @ 2024-07-09 317553/week @ 2024-07-16 321565/week @ 2024-07-23 321832/week @ 2024-07-30 263331/week @ 2024-08-06

1,275,642 每月下载量
用于 1,046 个crate(144 个直接使用)

MIT/Apache

255KB
4.5K SLoC

License: MIT Apache License 2.0 docs.rs crates.io Download numbers Github CI Minimum rustc version

X.509解析器

A X.509 v3 (RFC5280) 解析器,使用nom解析器组合器框架实现。

它完全用Rust编写,速度快,大量使用零拷贝技术。在设计和实现过程中,非常注重安全性,包括递归限制、防御性编程、测试和模糊测试。它还旨在避免恐慌。

代码在GitHub上可用,并属于Rusticata项目。

证书通常以PEM(通常是最常见格式)或DER两种主要格式编码。PEM编码的证书是一个容器,存储DER对象。有关更多文档,请参阅pem模块。

解析DER编码的证书的主要方法是使用X509Certificate::from_derFromDer trait的一部分),它构建一个X509Certificate对象。

另一种方法是使用X509CertificateParser,它允许指定解析选项(例如,不自动解析选项内容)。

解析器返回的对象遵循RFC的定义。这意味着通过递归访问结构体成员来访问字段。提供了一些辅助函数,例如X509Certificate::issuer()返回的结果与访问<object>.tbs_certificate.issuer相同。

对于PEM编码的证书,使用pem模块。

示例

解析DER格式的证书

use x509_parser::prelude::*;

static IGCA_DER: &[u8] = include_bytes!("../assets/IGC_A.der");

let res = X509Certificate::from_der(IGCA_DER);
match res {
    Ok((rem, cert)) => {
        assert!(rem.is_empty());
        //
        assert_eq!(cert.version(), X509Version::V3);
    },
    _ => panic!("x509 parsing failed: {:?}", res),
}

解析CRL并打印被撤销证书的信息

#
#
let res = CertificateRevocationList::from_der(DER);
match res {
    Ok((_rem, crl)) => {
        for revoked in crl.iter_revoked_certificates() {
            println!("Revoked certificate serial: {}", revoked.raw_serial_as_string());
            println!("  Reason: {}", revoked.reason_code().unwrap_or_default().1);
        }
    },
    _ => panic!("CRL parsing failed: {:?}", res),
}

参见examples/print-cert.rs

特性

/// Cryptographic signature verification: returns true if certificate was signed by issuer
#[cfg(feature = "verify")]
pub fn check_signature(cert: &X509Certificate<'_>, issuer: &X509Certificate<'_>) -> bool {
    let issuer_public_key = issuer.public_key();
    cert
        .verify_signature(Some(issuer_public_key))
        .is_ok()
}
  • 添加了validate特性,使用Validate特质在证书结构和值上运行更多验证函数。它不会验证任何加密参数(见上文的verify)。

Rust版本要求

x509-parser需要Rustc版本1.63或更高,基于der-parser依赖和proc-macro属性支持。

注意,由于time crate的破坏性变更,对于≤1.63的编译器版本,必须指定此crate的特定版本:cargo update -p time --precise 0.3.20

变更

参见CHANGELOG.md

许可证

根据您的选择,许可协议为以下之一

贡献

除非您明确说明,否则任何有意提交给您的工作并由Apache-2.0许可证定义的贡献,将根据上述协议双许可,不附加任何额外条款或条件。

依赖项

~3–12MB
~157K SLoC