12 个不稳定版本 (3 个重大更改)
0.4.6 | 2024年6月1日 |
---|---|
0.4.5 | 2024年1月8日 |
0.4.4 | 2023年11月19日 |
0.4.0 | 2023年10月29日 |
0.1.1 | 2023年10月25日 |
#1042 in 加密学
每月下载量 624
50KB
922 行
x509-verify

这是一个纯 Rust 实现,无需标准库的 X.509 验证库。它使用了 RustCrypto 的 X.509 格式、DSA、RSA 和 ECDSA 实现。以及 dalek 的 Ed25519 版本。
该库的目的是提供一种通用方法来验证常见的 X.509 算法标识符。它旨在抽象掉 X.509 结构内签名的一些验证细节。例如
- 提取证书的公钥并将其映射到相应的密钥容器
- 提取签名的原始消息并运行它通过相应的摘要算法
- 提取签名字节并将它们结构化为标识算法所需的形式
该库大量依赖底层算法的外部实现。这些算法都将作为可选功能包含,以便用户可以选择与他们用例相关的任何内容。
安全警告
该库的一些功能处于早期实验阶段。请自行承担风险使用。
当前支持
DSA
DSA_WITH_SHA_1
DSA_WITH_SHA_224
DSA_WITH_SHA_256
EdDSA
ED25519
RSA
MD_2_WITH_RSA_ENCRYPTION
MD_5_WITH_RSA_ENCRYPTION
SHA_1_WITH_RSA_ENCRYPTION
SHA_224_WITH_RSA_ENCRYPTION
SHA_256_WITH_RSA_ENCRYPTION
SHA_384_WITH_RSA_ENCRYPTION
SHA_512_WITH_RSA_ENCRYPTION
ECDSA
ECDSA_WITH_SHA_224
ECDSA_WITH_SHA_256
ECDSA_WITH_SHA_384
ECDSA_WITH_SHA_512
EC 曲线
验证
#[cfg(all(feature = "rsa", feature = "sha2"))]
{
use der::{DecodePem, Encode};
use std::fs;
use x509_cert::Certificate;
use x509_verify::{Signature, VerifyInfo, VerifyingKey};
// Self-signed certificate
let cert = fs::read_to_string("testdata/rsa2048-sha256-crt.pem").unwrap();
let cert = Certificate::from_pem(&cert).unwrap();
let verify_info = VerifyInfo::new(
cert.tbs_certificate
.to_der()
.unwrap()
.into(),
Signature::new(
&cert.signature_algorithm,
cert.signature
.as_bytes()
.unwrap(),
),
);
let key: VerifyingKey = cert
.tbs_certificate
.subject_public_key_info
.try_into()
.unwrap();
// Keeps ownership
key.verify(&verify_info).unwrap();
// Throws away ownership
key.verify(verify_info).unwrap();
}
x509 功能
#[cfg(all(feature = "rsa", feature = "sha2", feature = "x509", feature = "pem"))]
{
use der::{Decode, DecodePem, Encode};
use std::{io::Read, fs};
use x509_verify::{
x509_cert::{crl::CertificateList, Certificate},
x509_ocsp::{BasicOcspResponse, OcspResponse, OcspResponseStatus},
VerifyingKey,
};
// CA-signed certificate
let ca = fs::read_to_string("testdata/digicert-ca.pem").unwrap();
let ca = Certificate::from_pem(&ca).unwrap();
let cert = fs::read_to_string("testdata/amazon-crt.pem").unwrap();
let cert = Certificate::from_pem(&cert).unwrap();
let key = VerifyingKey::try_from(&ca).unwrap();
key.verify(&cert).unwrap();
// CA-signed CRL
let ca = fs::read_to_string("testdata/GoodCACert.pem").unwrap();
let ca = Certificate::from_pem(&ca).unwrap();
let crl = fs::read("testdata/GoodCACRL.crl").unwrap();
let crl = CertificateList::from_der(&crl).unwrap();
let key = VerifyingKey::try_from(&ca).unwrap();
key.verify(&crl).unwrap();
// CA-signed OCSP response
let ca = fs::read_to_string("testdata/digicert-ca.pem").unwrap();
let ca = Certificate::from_pem(&ca).unwrap();
let res = fs::read("testdata/ocsp-amazon-resp.der").unwrap();
let res = OcspResponse::from_der(&res).unwrap();
assert_eq!(res.response_status, OcspResponseStatus::Successful);
let res = BasicOcspResponse::from_der(
res.response_bytes
.unwrap()
.response
.as_bytes(),
)
.unwrap();
let key = VerifyingKey::try_from(&ca).unwrap();
key.verify(&res).unwrap();
}
可选功能
功能 | 默认 | 描述 |
---|---|---|
md2 | MD-2 摘要 | |
md5 | MD-5 摘要 | |
sha1 | SHA-1 摘要 | |
sha2 | ✔️ | SHA-2 摘要 |
dsa | DSA 签名 | |
rsa | ✔️ | RSA 签名 |
k256 | ✔️ | secp256k1 ECDSA 签名 |
p192 | secp192r1 ECDSA 签名 | |
p224 | secp224r1 ECDSA 签名 | |
p256 | ✔️ | secp256r1 ECDSA 签名 |
p384 | ✔️ | secp384r1 ECDSA 签名 |
ecdsa | k256, p192, p224, p256, 和 p384 | |
ed25519 | ✔️ | Ed25519 签名 |
x509 | 启用 X.509 结构转换 | |
pem | 将 DecodePem 特性添加到 X.509 重新导入 |
|
std |
许可证
由您决定
依赖项
~8.5MB
~168K SLoC