@fidm/asn1

中文文档
1.0.4发布于 2019/03/03MITTypeScriptCommonJS零依赖近 30 天下载 255.9万

ASN.1/DER, PEM for Node.js

原始使用文档
文档目录8 节
  1. Install
  2. Documentation
  3. Dependents
  4. Example
  5. Parse a private key from PEM file with ASN.1 Template
  6. Build PKCS#8 private key ASN1 object from PKCS#1 private ke…
  7. Parse a certificate from PEM file
  8. License

@fidm/asn1

ASN.1/DER, PEM for Node.js.

NPM version Build Status Downloads

Install

npm i --save @fidm/asn1

Documentation

https://fidm.github.io/asn1/

Dependents

@fidm/x509

Example

Parse a private key from PEM file with ASN.1 Template

const fs = require('fs')
const { PEM, ASN1, Class, Tag } = require('@fidm/asn1')

// ASN.1 Template https://tools.ietf.org/html/rfc5208
const privateKeyValidator = {
  name: 'PrivateKeyInfo',
  class: Class.UNIVERSAL,
  tag: Tag.SEQUENCE,
  capture: 'privateKeyInfo',
  value: [{
    name: 'PrivateKeyInfo.Version',
    class: Class.UNIVERSAL,
    tag: Tag.INTEGER,
    capture: 'privateKeyVersion'
  }, {
    name: 'PrivateKeyInfo.AlgorithmIdentifier',
    class: Class.UNIVERSAL,
    tag: Tag.SEQUENCE,
    value: [{
      name: 'PrivateKeyAlgorithmIdentifier.algorithm',
      class: Class.UNIVERSAL,
      tag: Tag.OID,
      capture: 'privateKeyOID'
    }]
  }, {
    name: 'PrivateKeyInfo.PrivateKey',
    class: Class.UNIVERSAL,
    tag: Tag.OCTETSTRING,
    capture: 'privateKey'
  }]
}

const rootkey = PEM.parse(fs.readFileSync('./test/cert/rootkey.pem'))[0]
const captures = ASN1.parseDERWithTemplate(rootkey.body, privateKeyValidator)
console.log(captures)
// { privateKeyInfo:
//   <ASN1 { class: 'UNIVERSAL',
//     tag: 'SEQUENCE',
//     value:
//      [ { class: 'UNIVERSAL', tag: 'INTEGER', value: 0 },
//        { class: 'UNIVERSAL',
//          tag: 'SEQUENCE',
//          value:
//           [ { class: 'UNIVERSAL', tag: 'OID', value: '1.2.840.113549.1.1.1' },
//             { class: 'UNIVERSAL', tag: 'NULL', value: null } ] },
//        { class: 'UNIVERSAL',
//          tag: 'OCTETSTRING',
//          value:
//           <Buffer 30 82 04 a5 02 01 00 02 82 01 01 00 bf 9a 15 d6 cd cd ba ce d2 20 d8 3b a2 6b b9 03 1b 9e 12 02 bd ee 68 79 3d 4d e1 81 9a 65 89 21 5a 11 29 8b da a2 ... > } ] }>,
//  privateKeyVersion: <ASN1 { class: 'UNIVERSAL', tag: 'INTEGER', value: 0 }>,
//  privateKeyOID:
//   <ASN1 { class: 'UNIVERSAL', tag: 'OID', value: '1.2.840.113549.1.1.1' }>,
//  privateKey:
//   <ASN1 { class: 'UNIVERSAL',
//     tag: 'OCTETSTRING',
//     value:
//      <Buffer 30 82 04 a5 02 01 00 02 82 01 01 00 bf 9a 15 d6 cd cd ba ce d2 20 d8 3b a2 6b b9 03 1b 9e 12 02 bd ee 68 79 3d 4d e1 81 9a 65 89 21 5a 11 29 8b da a2 ... > }> }

Build PKCS#8 private key ASN1 object from PKCS#1 private key ASN1 object

const { ASN1, Class, Tag } = require('@fidm/asn1')

const rsaPrivateKeyASN1 = getSomeRSAPrivateKeyASN1()
const privateKeyASN1 = ASN1.Seq([
  // Version (INTEGER)
  rsaPrivateKeyASN1.value[0],
  // AlgorithmIdentifier
  ASN1.Seq([
    // algorithm
    ASN1.OID('1.2.840.113549.1.1.1'),
    // optional parameters
    ASN1.Null(),
  ]),
  // PrivateKey
  new ASN1(Class.UNIVERSAL, Tag.OCTETSTRING, rsaPrivateKeyASN1.DER),
])

Parse a certificate from PEM file

const fs = require('fs')
const { PEM, ASN1 } = require('@fidm/asn1')

const pems = PEM.parse(fs.readFileSync('./test/cert/github.crt'))
const asn1 = ASN1.fromDER(pems[0].body)
console.log(asn1)
// <ASN1 { class: 'UNIVERSAL',
//   tag: 'SEQUENCE',
//   value:
//    [ { class: 'UNIVERSAL',
//        tag: 'SEQUENCE',
//        value:
//         [ { class: 'CONTEXT_SPECIFIC',
//             tag: 0,
//             value: [ { class: 'UNIVERSAL', tag: 'INTEGER', value: 2 } ] },
//           { class: 'UNIVERSAL',
//             tag: 'INTEGER',
//             value: '0a0630427f5bbced6957396593b6451f' },
//           { class: 'UNIVERSAL',
//             tag: 'SEQUENCE',
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'OID',
//                  value: '1.2.840.113549.1.1.11' },
//                { class: 'UNIVERSAL', tag: 'NULL', value: null } ] },
//           { class: 'UNIVERSAL',
//             tag: 'SEQUENCE',
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.6' },
//                          { class: 'UNIVERSAL', tag: 'PRINTABLESTRING', value: 'US' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.10' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'DigiCert Inc' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.11' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'www.digicert.com' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.3' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'DigiCert SHA2 Extended Validation Server CA' } ] } ] } ] },
//           { class: 'UNIVERSAL',
//             tag: 'SEQUENCE',
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'UTCTIME',
//                  value: 2018-05-08T00:00:00.000Z },
//                { class: 'UNIVERSAL',
//                  tag: 'UTCTIME',
//                  value: 2020-06-03T12:00:00.000Z } ] },
//           { class: 'UNIVERSAL',
//             tag: 'SEQUENCE',
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.15' },
//                          { class: 'UNIVERSAL',
//                            tag: 'UTF8',
//                            value: 'Private Organization' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL',
//                            tag: 'OID',
//                            value: '1.3.6.1.4.1.311.60.2.1.3' },
//                          { class: 'UNIVERSAL', tag: 'PRINTABLESTRING', value: 'US' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL',
//                            tag: 'OID',
//                            value: '1.3.6.1.4.1.311.60.2.1.2' },
//                          { class: 'UNIVERSAL', tag: 'PRINTABLESTRING', value: 'Delaware' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.5' },
//                          { class: 'UNIVERSAL', tag: 'PRINTABLESTRING', value: '5157550' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.6' },
//                          { class: 'UNIVERSAL', tag: 'PRINTABLESTRING', value: 'US' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.8' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'California' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.7' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'San Francisco' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.10' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'GitHub, Inc.' } ] } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'SET',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.4.3' },
//                          { class: 'UNIVERSAL',
//                            tag: 'PRINTABLESTRING',
//                            value: 'github.com' } ] } ] } ] },
//           { class: 'UNIVERSAL',
//             tag: 'SEQUENCE',
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'SEQUENCE',
//                  value:
//                   [ { class: 'UNIVERSAL', tag: 'OID', value: '1.2.840.113549.1.1.1' },
//                     { class: 'UNIVERSAL', tag: 'NULL', value: null } ] },
//                { class: 'UNIVERSAL',
//                  tag: 'BITSTRING',
//                  value:
//                   BitString {
//                     buf:
//                      <Buffer 30 82 01 0a 02 82 01 01 00 c6 3c aa f2 3c 97 0c 3a c1 4f 28 ad 72 70 7d d3 ce b9 b5 60 73 a4 74 9b 8a 77 46 fd 7a 98 42 4c c5 30 19 57 9a a9 33 0b e1 ... >,
//                     bitLen: 2160 } } ] },
//           { class: 'CONTEXT_SPECIFIC',
//             tag: 3,
//             value:
//              [ { class: 'UNIVERSAL',
//                  tag: 'SEQUENCE',
//                  value:
//                   [ { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.35' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 16 80 14 3d d3 50 a5 d6 a0 ad ee f3 4a 60 0a 65 d3 21 d4 f8 f8 d6 0f> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.14' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 04 14 c9 c2 53 61 66 9d 5f ab 25 f4 26 cd 0f 38 9a a8 49 ea 48 a9> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.17' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 1c 82 0a 67 69 74 68 75 62 2e 63 6f 6d 82 0e 77 77 77 2e 67 69 74 68 75 62 2e 63 6f 6d> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.15' },
//                          { class: 'UNIVERSAL', tag: 'BOOLEAN', value: true },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value: <Buffer 03 02 05 a0> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.37' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 14 06 08 2b 06 01 05 05 07 03 01 06 08 2b 06 01 05 05 07 03 02> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.31' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 6c 30 34 a0 32 a0 30 86 2e 68 74 74 70 3a 2f 2f 63 72 6c 33 2e 64 69 67 69 63 65 72 74 2e 63 6f 6d 2f 73 68 61 32 2d 65 76 2d 73 65 72 76 65 72 2d ... > } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.32' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 42 30 37 06 09 60 86 48 01 86 fd 6c 02 01 30 2a 30 28 06 08 2b 06 01 05 05 07 02 01 16 1c 68 74 74 70 73 3a 2f 2f 77 77 77 2e 64 69 67 69 63 65 72 ... > } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '1.3.6.1.5.5.7.1.1' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 30 7a 30 24 06 08 2b 06 01 05 05 07 30 01 86 18 68 74 74 70 3a 2f 2f 6f 63 73 70 2e 64 69 67 69 63 65 72 74 2e 63 6f 6d 30 52 06 08 2b 06 01 05 05 07 ... > } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL', tag: 'OID', value: '2.5.29.19' },
//                          { class: 'UNIVERSAL', tag: 'BOOLEAN', value: true },
//                          { class: 'UNIVERSAL', tag: 'OCTETSTRING', value: <Buffer 30 00> } ] },
//                     { class: 'UNIVERSAL',
//                       tag: 'SEQUENCE',
//                       value:
//                        [ { class: 'UNIVERSAL',
//                            tag: 'OID',
//                            value: '1.3.6.1.4.1.11129.2.4.2' },
//                          { class: 'UNIVERSAL',
//                            tag: 'OCTETSTRING',
//                            value:
//                             <Buffer 04 82 01 6a 01 68 00 76 00 a4 b9 09 90 b4 18 58 14 87 bb 13 a2 cc 67 70 0a 3c 35 98 04 f9 1b df b8 e3 77 cd 0e c8 0d dc 10 00 00 01 63 41 62 6d 0a 00 ... > } ] } ] } ] } ] },
//      { class: 'UNIVERSAL',
//        tag: 'SEQUENCE',
//        value:
//         [ { class: 'UNIVERSAL',
//             tag: 'OID',
//             value: '1.2.840.113549.1.1.11' },
//           { class: 'UNIVERSAL', tag: 'NULL', value: null } ] },
//      { class: 'UNIVERSAL',
//        tag: 'BITSTRING',
//        value:
//         BitString {
//           buf:
//            <Buffer 70 0f 5a 96 a7 58 e5 bf 8a 9d a8 27 98 2b 00 7f 26 a9 07 da ba 7b 82 54 4f af 69 cf bc f2 59 03 2b f2 d5 74 58 25 d8 1e a4 20 76 62 60 29 73 2a d7 dc ... >,
//           bitLen: 2048 } } ] }>

License

@fidm/asn1 is licensed under the MIT license. Copyright © 2018-2019 FIdM.

版本与发布记录

@fidm/asn1 共发布 5 个版本,首次发布于 2018/05/28;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.0.4latest2019/03/037 年前
1.0.32018/09/128 年前
1.0.22018/06/028 年前
1.0.12018/05/298 年前
1.0.02018/05/288 年前

关于 @fidm/asn1 的常见问题

@fidm/asn1 是什么?

ASN.1/DER, PEM for Node.js

如何安装 @fidm/asn1?

在项目目录运行 npm install @fidm/asn1,或使用 pnpm add / yarn add / bun add。

@fidm/asn1 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@fidm/asn1 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@fidm/asn1 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 8。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@fidm/asn1 可以商用吗?

@fidm/asn1 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fidm/asn1 的下载量有多少?

根据 npm 官方下载统计,@fidm/asn1 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,558,981 次,日均约 85,299 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fidm/asn1 还在维护吗?

最新版本 1.0.4 发布于 2019/03/03(7 年前);至今共发布 5 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/05/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。