kjanat/micro509

GitHub: kjanat/micro509

一个零依赖的 TypeScript PKI 工具包,基于纯 WebCrypto 实现证书创建、解析、验证及吊销等完整的 X.509 工作流。

Stars: 0 | Forks: 0

# micro509 [![NPM](https://img.shields.io/npm/v/micro509?logo=npm&labelColor=CB3837&color=black)][npm] [![JSR](https://img.shields.io/jsr/v/@kjanat/micro509?logoColor=083344&logo=jsr&logoSize=auto&label=&labelColor=f7df1e&color=black)][jsr] [![Socket](https://badge.socket.dev/npm/package/micro509)][socket] 一个零依赖的 TypeScript PKI 工具包,用于证书、验证、吊销和 PKCS 工作流。 零依赖。支持 Tree-shaking 的子路径入口点。纯 WebCrypto。到处运行:Node、Bun、Deno、浏览器、Cloudflare Workers。 ## 安装 ``` npm install micro509 ``` ## 为什么选择 micro509 JavaScript PKI 库通常会迫使你做出糟糕的权衡: 重量级的标准工具包、遗留的加密大杂烩, 或是功能单一的解析工具。 micro509 是一个实用的折中方案:一个现代的、原生支持 WebCrypto 的 PKI 工具包,具有零运行时依赖和类型化的 API,适用于大多数应用程序实际需要的 工作流。 它为你提供了一个用于创建证书和 CSR、 链验证、服务身份匹配、CRL、OCSP、 PKCS#7 SignedData、PFX/PKCS#12、PEM 处理和密钥 导入/导出的单一库。 并且当验证失败时,你会获得你的代码可以处理的类型化结果:[针对每种失败模式的类型化错误代码]、失败的 证书索引,以及结构化的失败详细信息,而不是 `false`。 ``` if (!result.ok) { // result.error.code: 'signature_invalid' | 'certificate_expired' | 'name_constraints_violated' | ... // result.error.index: which certificate in the chain failed // result.error.details: { expected, actual } for identity mismatches } ``` 除了验证之外,micro509 还涵盖了在一个零依赖的 JS 包中很难找到的 PKI 领域: - **OCSP** — 构建请求、解析和验证响应、验证响应者授权 - **PFX / PKCS#12** — 创建和解析受密码保护的密钥+证书包 - **PKCS#7 / CMS** — 签名内容、解析和验证 SignedData、提取证书包 - **CRLs** — 创建、解析、验证和检查吊销状态 - **加密密钥** — PBES2 PKCS#8、遗留 OpenSSL 加密 PEM、PKCS#1、SEC1 - **密钥导入/导出** — PKCS#8、SPKI、JWK、PKCS#1、SEC1,支持生成 RSA、ECDSA、Ed25519 - **服务身份** — 通配符 DNS、IPv6 规范化、URI-ID、SRV-ID、显式 CN 选择性启用 严格的默认值,显式的逃生舱 — 诸如 CN 回退或自签名叶证书接受等危险操作需要显式开启。所有这些都没有 `any`, 没有类型断言,没有非空断言,也没有会破坏边缘运行时的运行时 DI 框架。 ## 快速开始 创建一个自签名证书: ``` import { createSelfSignedCertificate } from 'micro509'; const { certificate, keyPair } = await createSelfSignedCertificate({ subject: { commonName: 'example.com', organization: 'Acme', country: 'US', }, validity: { days: 30 }, extensions: { keyUsage: ['digitalSignature', 'keyEncipherment'], subjectAltNames: [ { type: 'dns', value: 'example.com' }, { type: 'dns', value: 'www.example.com' }, ], }, }); console.log(certificate.pem); console.log(await keyPair.exportPkcs8Pem()); ``` 创建一个 CSR: ``` import { createCertificateSigningRequest, generateKeyPair } from 'micro509'; const keyPair = await generateKeyPair({ kind: 'ed25519' }); const csr = await createCertificateSigningRequest({ subject: { commonName: 'csr.example' }, publicKey: keyPair.publicKey, signerPrivateKey: keyPair.privateKey, extensions: { subjectAltNames: [{ type: 'dns', value: 'csr.example' }], }, }); console.log(csr.pem); ``` 解析一个证书: ``` import { parseCertificatePem, unwrap } from 'micro509'; // Using certificate from previous example const parsed = unwrap(parseCertificatePem(certificate.pem)); console.log(parsed.subject.values.commonName); console.log(parsed.extendedKeyUsage); console.log(parsed.authorityInfoAccess); ``` `parseCertificatePem` 返回一个类型化的 `Result` — 检查 `result.ok`,或者 对于格式错误的输入调用 `unwrap()` 抛出异常。 验证一个链: ``` import { verifyCertificateChain } from 'micro509'; // Assuming you have a self-signed certificate used as both leaf and root; no intermediates const result = await verifyCertificateChain({ leaf: certificate.pem, intermediates: [], roots: [certificate.pem], // Using self-signed cert as root for demo purpose: 'serverAuth', serviceIdentity: { type: 'dns', value: 'example.com' }, }); if (result.ok) { console.log(result.value.chain.length); } else { console.log(result.error.code); } ``` ## 运行时支持 | 运行时 | 状态 | 备注 | | ------- | --------- | -------------------------------------------------- | | Node | supported | 带有 WebCrypto 全局变量的现代 Node(在 24+ 上测试) | | Bun | supported | Bun 1.3+ | | Deno | supported | 需要 WebCrypto 和 Web text/base64 全局变量 | | Browser | supported | 仅限现代浏览器 | | Worker | supported | 需要相同的 WebCrypto 和 text/base64 全局变量 | 核心保持纯 ESM 且无副作用。 ## 算法支持 | 领域 | 内置支持 | | ------------------------------ | -------------------------------------------------------------------- | | 证书和 CSR 签名 | RSA PKCS#1 v1.5, RSA-PSS, ECDSA `P-256` / `P-384` / `P-521`, Ed25519 | | RSA 密钥 API | `scheme: 'pkcs1-v1_5'` | | ECDSA 密钥 API | `P-256`, `P-384`, `P-521` | | 加密的 PKCS#8 和 PFX | PBES2 配合 AES-CBC 以及 PBKDF2 HMAC-SHA1/HMAC-SHA256 | | 加密的传统 PEM | 用于 RSA 和 EC 私钥的 AES-128-CBC, AES-192-CBC, AES-256-CBC | `micro509` 专注于在现代 X.509 和基于 WebCrypto 的运行时中具有广泛互操作性的算法。\ 它有意将小众的、特定于区块链的或仅用于密钥协商的原语排除在核心 API 之外,除非库明确支持的 PKI 工作流需要它们。 ## 标准状态 | 领域 | 状态 | | ---------------------------- | -------- | | RFC 5280 路径验证 | complete | | RFC 6960 OCSP | complete | | RFC 6125 服务身份 | complete | | RFC 9618 策略验证 | complete | 有关详细的范围边界,请参阅 [`docs/PKIX-SCOPE.md`](./docs/PKIX-SCOPE.md);有关公共模块范围,请参阅 [API 参考](https://micro509.kjanat.dev/api/)。 ## 导入 对于大多数应用程序,使用根包: ``` import { createCertificate, parseCertificatePem, verifyCertificateChain } from 'micro509'; ``` 当你想要详尽的高级类型或更窄的 工作流范围时,使用领域入口点: ``` import { parseCertificatePem } from 'micro509/x509'; import { verifyCertificateChain, matchServiceIdentity } from 'micro509/verify'; import { createOcspRequest, checkCertificateRevocation } from 'micro509/revocation'; import { createPfx } from 'micro509/pkcs'; import { generateKeyPair } from 'micro509/keys'; import { pemDecode, pemEncode } from 'micro509/pem'; import type { Micro509Error } from 'micro509/result'; ``` 完整的稳定子路径列表位于 [API 参考](https://micro509.kjanat.dev/api/)中。 ## 更多文档 - API 参考: [micro509.kjanat.dev/api](https://micro509.kjanat.dev/api/) - 标准范围: [`docs/PKIX-SCOPE.md`](./docs/PKIX-SCOPE.md) - PKITS 测试套件: [`test/pkits.test.ts`](./test/pkits.test.ts) - 差异化测试套件: [`test/differential.test.ts`](./test/differential.test.ts) - 贡献指南: [`CONTRIBUTING.md`](./CONTRIBUTING.md) ## 许可证 [MIT](./LICENSE)
标签:MITM代理, SOC Prime, TypeScript, WebCrypto, 加解密, 安全插件, 密码学, 开发工具, 手动系统调用, 数字证书, 程序员工具, 自动化攻击