跳至内容
liuzhen932 的小窝
返回

简单讲讲 ASN.1 与 OID

当你打开一个 HTTPS 网站,浏览器会校验证书中的签名算法;当网络管理员通过 SNMP 监控交换机端口流量,系统会读取一个个管理变量;当手机接入 4G/5G 网络,核心网与终端之间交换着复杂的信令。这些看似毫无关联的场景,背后却共同依赖着两项已经存在了三十多年的技术——ASN.1 和 OID。

本文由人工智能辅助收集资料和创作。

摘要

ASN.1(Abstract Syntax Notation One,抽象语法记法一)是一套用于描述数据结构的标准化语言,广泛应用于通信协议、安全证书、电信系统、网络管理、密码学、身份认证等领域。它并不直接规定数据在字节层面的具体表示方式,而是定义一种与平台、编程语言、操作系统和传输介质无关的数据描述方法。

OID(Object Identifier,对象标识符)是一种层次化、全局唯一的标识机制,常与 ASN.1 一起使用。OID 可以为算法、证书扩展、组织、协议对象、管理对象、属性类型等分配唯一编号。X.509 证书、SNMP MIB、LDAP Schema、PKCS 系列标准以及大量密码学协议都大量依赖 OID。

ASN.1 解决的是“如何准确描述数据结构”的问题,OID 解决的是“如何全局唯一标识对象”的问题。二者结合,使得复杂系统中的数据结构、算法、属性、协议元素可以被精确描述、唯一标识并长期互操作。

ASN.1

ASN.1(Abstract Syntax Notation One,抽象语法标记一)是一种独立于机器架构的数据描述语言。你可以把它想象成一份用通用术语写成的数据结构菜单,而具体的烹饪方法(编码规则)可以另选。

它的核心理念是:先抽象定义信息的内容和结构,再根据场景选择具体的二进制表达方式。

例如:

Person ::= SEQUENCE {
    name        UTF8String,
    age         INTEGER,
    email       IA5String OPTIONAL
}

这个定义表示:

ASN.1 本身不是一种编程语言,也不是一种网络协议,而是一种数据抽象描述语言

简单来说,它的核心目标是:

  1. 精确描述数据结构;
  2. 与具体编程语言无关;
  3. 与 CPU 架构、字节序、操作系统无关;
  4. 与具体编码方式解耦;
  5. 便于不同厂商、不同系统、不同语言实现之间互操作。

ASN.1 的标准体系

ASN.1 由 ITU-T 和 ISO/IEC 联合标准化。其核心标准主要包括:

标准内容
ITU-T X.680 / ISO/IEC 8824-1ASN.1 基本记法规范
ITU-T X.681 / ISO/IEC 8824-2信息对象规范
ITU-T X.682 / ISO/IEC 8824-3约束规范
ITU-T X.683 / ISO/IEC 8824-4参数化 ASN.1 规范
ITU-T X.690 / ISO/IEC 8825-1BER、CER、DER 编码规则
ITU-T X.691 / ISO/IEC 8825-2PER 编码规则
ITU-T X.692 / ISO/IEC 8825-3ECN 编码控制记法
ITU-T X.693 / ISO/IEC 8825-4XER XML 编码规则
ITU-T X.696 / ISO/IEC 8825-7OER 编码规则
ITU-T X.697 / ISO/IEC 8825-8JER JSON 编码规则

ASN.1 的标准化非常成熟,其历史可以追溯到 20 世纪 80 年代,并长期用于电信、金融、网络安全、身份认证等对互操作性要求极高的领域。

ASN.1 的设计思想

ASN.1 中有两个非常重要的概念:

  1. 抽象语法
  2. 传输语法

抽象语法

抽象语法描述的是数据的逻辑结构。例如:

CertificateSerialNumber ::= INTEGER

这个定义只说明证书序列号是一个整数,但没有说明它在网络上传输时应该占几个字节、采用大端还是小端、是否带长度字段等。

传输语法

传输语法描述的是数据如何被编码成字节流。ASN.1 的传输语法由各种编码规则提供,例如:

同一个 ASN.1 数据结构可以使用不同编码规则转换为不同形式的字节流。这种设计使得 ASN.1 具有很强的抽象性和可移植性。

OID:全球命名的那棵树

OID(Object Identifier,对象标识符)是一种全球唯一、层次化、树状分配的标识体系。它常用于给算法、组织、标准、证书扩展、目录属性、网络管理对象等分配唯一名称。相比普通字符串名称,OID 的优势在于它不依赖自然语言,不容易因为同名而冲突,并且可以通过分层授权长期扩展。

一个典型 OID 如下:

1.2.840.113549.1.1.1

它表示 RSA 加密算法 rsaEncryption。这个数字串看似晦涩,但实际上它是一条从 OID 根节点一路向下的路径。

OID 的基本形式

OID 通常使用点分十进制表示,每个数字称为一个 arc,可译为“弧”或“节点”。

1.2.840.113549.1.1.1

可以拆成:

1 / 2 / 840 / 113549 / 1 / 1 / 1

也可以写成 ASN.1 名称形式:

{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) rsaEncryption(1) }

两种写法表达的是同一个对象:

表示方式示例
点分十进制1.2.840.113549.1.1.1
ASN.1 命名形式{ iso member-body us rsadsi pkcs pkcs-1 rsaEncryption }
ASN.1 名称加数字形式{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) rsaEncryption(1) }

点分十进制最适合程序、配置文件和日志;名称形式更适合标准文档和人工阅读。

OID 树的根节点

OID 是一棵树。根节点下面最重要的三个一级分支是:

第一弧名称管理者说明
0itu-tITU-T国际电信联盟电信标准化部门管理
1isoISO国际标准化组织管理
2joint-iso-itu-tISO 与 ITU-T 联合管理ISO 和 ITU-T 联合分配的对象

可以把它想象成:

OID Root
├── 0 itu-t
├── 1 iso
└── 2 joint-iso-itu-t

OID 的唯一性来自这棵树的分层授权:上级节点把某个子节点分配给一个组织后,该组织就可以在自己的子树下继续分配新的节点。

从树根走到 RSA:一个 OID 的路径

还是以 rsaEncryption 的 OID 为例:

1.2.840.113549.1.1.1

它可以展开为:

iso(1)
└── member-body(2)
    └── us(840)
        └── rsadsi(113549)
            └── pkcs(1)
                └── pkcs-1(1)
                    └── rsaEncryption(1)

对应关系如下:

名称含义
1isoISO 分支
2member-bodyISO 成员体
840us美国
113549rsadsiRSA Data Security, Inc.
1pkcsPublic-Key Cryptography Standards
1pkcs-1PKCS #1 标准
1rsaEncryptionRSA 加密算法标识符

这个例子体现了 OID 的核心思想:每个 OID 都不是孤立编号,而是一条有管理来源的树路径。

OID 为什么能做到全球唯一

OID 不是靠一个中央数据库为所有对象逐个命名,而是靠层级分配保证唯一性。

例如:

1.2.840.113549

这个节点分配给 RSA Data Security, Inc. 后,RSA 就可以在其下继续定义:

1.2.840.113549.1
1.2.840.113549.1.1
1.2.840.113549.1.1.1
1.2.840.113549.1.1.5
1.2.840.113549.1.1.11

只要每个节点的管理者不在自己的子树下重复分配同一个子编号,整棵树就能保持全局唯一。

这种机制与域名系统有些相似:

对比项OIDDNS 域名
结构树状结构树状结构
唯一性来源分层授权分层授权
表示方式数字弧,如 1.2.840...名称标签,如 www.example.com
是否必须可解析不一定通常需要 DNS 解析
主要用途标识对象、算法、属性、扩展定位网络资源
稳定性通常长期稳定可能随注册变化

OID 更像是标准世界中的永久编号,而不是互联网访问地址。

OID 在 ASN.1 中的表示

ASN.1 直接提供了 OBJECT IDENTIFIER 类型。

例如:

AlgorithmIdentifier ::= SEQUENCE {
    algorithm   OBJECT IDENTIFIER,
    parameters  ANY OPTIONAL
}

这个结构的含义是:

例如:

algorithm = 1.2.840.113549.1.1.1

表示 RSA 加密算法。

algorithm = 1.2.840.10045.2.1

表示椭圆曲线公钥算法。

也就是说,OID 常常不仅仅是一个编号,而是一个“解释开关”:看到某个 OID,解析器才知道后面的数据应该按照什么规则理解。

OID 与 X.509 证书

X.509 证书是普通用户最容易接触到 OID 的地方。证书中的很多字段都由 OID 标识。

证书属性 OID

名称OID含义
commonName2.5.4.3通用名称
countryName2.5.4.6国家
localityName2.5.4.7地区/城市
stateOrProvinceName2.5.4.8省/州
organizationName2.5.4.10组织名称
organizationalUnitName2.5.4.11组织单位

证书扩展 OID

扩展名OID作用
subjectKeyIdentifier2.5.29.14主体密钥标识符
keyUsage2.5.29.15密钥用途
subjectAltName2.5.29.17主体备用名称
basicConstraints2.5.29.19是否为 CA、路径长度限制
cRLDistributionPoints2.5.29.31CRL 分发点
certificatePolicies2.5.29.32证书策略
authorityKeyIdentifier2.5.29.35颁发者密钥标识符
extendedKeyUsage2.5.29.37扩展密钥用途

例如证书扩展通常可抽象为:

Extension ::= SEQUENCE {
    extnID      OBJECT IDENTIFIER,
    critical    BOOLEAN DEFAULT FALSE,
    extnValue   OCTET STRING
}

其中 extnID 就是扩展的 OID。解析器根据它判断 extnValue 里面到底是什么结构。

OID 与算法标识

密码学协议大量使用 OID 来标识算法。原因很简单:算法名称可能有别名、大小写差异或历史写法,而 OID 是明确的数字标识

算法或对象OID
rsaEncryption1.2.840.113549.1.1.1
sha1WithRSAEncryption1.2.840.113549.1.1.5
sha256WithRSAEncryption1.2.840.113549.1.1.11
id-RSASSA-PSS1.2.840.113549.1.1.10
id-sha11.3.14.3.2.26
id-sha2562.16.840.1.101.3.4.2.1
id-sha3842.16.840.1.101.3.4.2.2
id-sha5122.16.840.1.101.3.4.2.3
id-ecPublicKey1.2.840.10045.2.1
ecdsa-with-SHA2561.2.840.10045.4.3.2

例如,一个证书中如果出现 1.2.840.113549.1.1.11,解析器就知道它表示 sha256WithRSAEncryption,而不是只凭字符串猜测算法。

OID 与 SNMP 网络管理

在 SNMP 中,OID 是管理对象的「地址」。网络管理系统通过 OID 查询设备信息,例如设备名称、接口流量、运行时间等。

一个常见 OID:

1.3.6.1.2.1.1.1.0

表示 sysDescr.0,也就是系统描述信息。

展开如下:

iso(1)
└── identified-organization(3)
    └── dod(6)
        └── internet(1)
            └── mgmt(2)
                └── mib-2(1)
                    └── system(1)
                        └── sysDescr(1)
                            └── instance(0)

常见 SNMP OID:

名称OID含义
internet1.3.6.1Internet 分支
mib-21.3.6.1.2.1MIB-2
system1.3.6.1.2.1.1系统组
sysDescr.01.3.6.1.2.1.1.1.0系统描述
sysObjectID.01.3.6.1.2.1.1.2.0系统对象 ID
sysUpTime.01.3.6.1.2.1.1.3.0系统运行时间
sysContact.01.3.6.1.2.1.1.4.0联系人
sysName.01.3.6.1.2.1.1.5.0系统名称
sysLocation.01.3.6.1.2.1.1.6.0系统位置

这里末尾的 .0 有时很重要,它表示标量对象的具体实例。

OID 不是「含义本身」,而是「含义的索引」

理解 OID 时要避免一个误区:OID 本身只是标识符,它不是算法、不是证书扩展、也不是数据结构本体。

例如:2.5.29.17,它表示 subjectAltName 这个证书扩展,但真正的数据结构还要看 X.509 标准如何定义。

因此,OID 更像数据库中的主键:

OID → 查询标准定义 → 得到语义和解析方式

自定义 OID 与私有分支

如果组织需要定义自己的证书扩展、SNMP MIB、LDAP Schema 或内部协议对象,通常应该申请或使用合法分配的 OID 分支。

SNMP 企业私有分支常见路径是:

1.3.6.1.4.1

也就是:

iso(1)
└── identified-organization(3)
    └── dod(6)
        └── internet(1)
            └── private(4)
                └── enterprise(1)

如果某企业获得编号 99999,则可以在:

1.3.6.1.4.1.99999

下面继续分配:

1.3.6.1.4.1.99999.1
1.3.6.1.4.1.99999.2
1.3.6.1.4.1.99999.100.1

一个良好的私有 OID 文档通常应包括:

项目说明
OID 数字例如 1.3.6.1.4.1.99999.1.1
名称例如 exampleDeviceStatus
所属分支说明由哪个组织管理
用途标识算法、扩展、属性或管理对象
数据类型对应 ASN.1 类型或协议类型
编码规则DER、BER、PER、OER 等
版本策略是否允许扩展、如何兼容
安全语义是否影响认证、授权、加密或策略判断

使用 OID 时的注意事项

不要随意占用别人的 OID

OID 的意义来自唯一性。随意使用已有 OID 会导致严重歧义。例如,把自己的私有扩展伪装成标准扩展 OID,可能导致解析器误解数据结构,甚至产生安全问题。

不要只记录名称,忽略数字

名称可能存在别名或大小写差异,但数字 OID 是最稳定的表示。例如应写:

sha256WithRSAEncryption: 1.2.840.113549.1.1.11

不要认为看到 OID 就等于安全

OID 只能说明「这是什么」,不能说明是否安全

必须结合标准解释参数

同样是 AlgorithmIdentifier,不同算法对 parameters 字段要求不同。有的要求为 NULL,有的要求省略,有的需要复杂结构。实现时必须查阅对应标准,不能机械套用。

OID 是标准世界的坐标系

OID 的本质是一套全球命名坐标系。它用一棵分层授权的树,把世界上的标准、组织、算法、属性、扩展、管理对象连接起来。在 ASN.1、X.509、SNMP、LDAP、PKCS、CMS 等体系中,OID 正是这种“全球唯一名称”的基础设施。

OID 不负责承载数据本身,而负责告诉系统“这个数据、算法或对象到底是谁”。

二者如何协作

如果 ASN.1 是一种「描述语法」,OID 就是这种语法里随处被引用的「全局常量」。在 ASN.1 模块中,可以主动为某个对象赋予一个 OID 名称,比如:

-- 为虚构的 Example 公司注册一个基础 OID
id-example  OBJECT IDENTIFIER ::= { 1 3 6 1 4 1 99999 }

-- 在该公司子树下定义一个访问控制扩展
id-ce-exampleAccessControl  OBJECT IDENTIFIER ::= { id-example 1 }

ExampleAccessControl ::= SEQUENCE {
    requiredRole  UTF8String,
    clearance     INTEGER
}

通过这段定义,任何系统只要看到 1.3.6.1.4.1.99999.1 这个 OID,就能自动理解其后跟随的数据应该按 ExampleAccessControl 的结构来解析。协议设计者可以用 OID 来标记算法、证书策略、文件格式等,把灵活的语义拓展埋入有序的注册体系当中。

藏在身边的 ASN.1 & OID

ASN.1 和 OID 看似是偏底层、偏标准化的技术,但实际上它们经常隐藏在日常使用的网络、证书、设备和身份系统背后。我们平时不一定直接看到 ASN.1 语法或 OID 数字串,却几乎每天都在间接使用它们。

ASN.1 像是一种隐藏的数据结构语言,OID 像是一套全球唯一编号系统。它们不常直接出现在用户界面中,却支撑着 HTTPS、数字证书、电子签名、网络设备管理、企业身份认证、移动通信等大量基础设施。

不可绕过的基石

ASN.1 和 OID 经常因为其复杂的编码规则和老旧的外表而被批评为「恐龙技术」。但如果只用「老旧」来评价它们,显然并不公平。

ASN.1 与 OID 之所以能长期存在,并不是因为历史包袱没有被清理,而是因为它们解决的是非常基础、非常长期的问题:如何精确描述数据结构,如何在全球范围内为对象分配稳定且唯一的名字

在数字证书、电子签名、SNMP 网络管理、LDAP 目录服务、移动通信信令等场景中,系统需要的不只是「能传数据」,还需要长期兼容、跨厂商互操作、可扩展、可标准化。ASN.1 提供了严谨的数据建模能力,OID 则提供了层次化的全球命名体系。它们看起来不像现代 JSON API 那样亲切,却在许多关键基础设施中承担着更底层、更稳定的角色。

所以,ASN.1 和 OID 或许确实带着恐龙的外表,但它们更像是仍在支撑地基的古老工程结构:不轻巧,不时髦,却足够坚固。对于普通开发者来说,可以不喜欢它们的语法和编码细节;但在理解证书、密码学协议、网络管理和通信标准时,绕开它们几乎是不可能的

参考资料

  1. ITU-T Recommendation X.680:Abstract Syntax Notation One (ASN.1): Specification of basic notation
    https://www.itu.int/rec/T-REC-X.680

  2. ITU-T Recommendation X.681:ASN.1 Information object specification
    https://www.itu.int/rec/T-REC-X.681

  3. ITU-T Recommendation X.682:ASN.1 Constraint specification
    https://www.itu.int/rec/T-REC-X.682

  4. ITU-T Recommendation X.683:ASN.1 Parameterization of ASN.1 specifications
    https://www.itu.int/rec/T-REC-X.683

  5. ITU-T Recommendation X.690:ASN.1 encoding rules: BER, CER and DER
    https://www.itu.int/rec/T-REC-X.690

  6. ITU-T Recommendation X.691:ASN.1 encoding rules: Packed Encoding Rules (PER)
    https://www.itu.int/rec/T-REC-X.691

  7. ITU-T Recommendation X.693:ASN.1 encoding rules: XML Encoding Rules (XER)
    https://www.itu.int/rec/T-REC-X.693

  8. ITU-T Recommendation X.696:ASN.1 encoding rules: Octet Encoding Rules (OER)
    https://www.itu.int/rec/T-REC-X.696

  9. ITU-T Recommendation X.697:ASN.1 encoding rules: JSON Encoding Rules (JER)
    https://www.itu.int/rec/T-REC-X.697

  10. ITU-T Recommendation X.660:Procedures for the operation of object identifier registration authorities
    https://www.itu.int/rec/T-REC-X.660

  11. ITU-T Object Identifier Repository
    https://oid-rep.orange-labs.fr/

  12. RFC 5280:Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
    https://www.rfc-editor.org/rfc/rfc5280

  13. RFC 5912:New ASN.1 Modules for the Public Key Infrastructure Using X.509 (PKIX)
    https://www.rfc-editor.org/rfc/rfc5912

  14. RFC 5911:New ASN.1 Modules for Cryptographic Message Syntax (CMS) and S/MIME
    https://www.rfc-editor.org/rfc/rfc5911

  15. RFC 8017:PKCS #1: RSA Cryptography Specifications Version 2.2
    https://www.rfc-editor.org/rfc/rfc8017

  16. RFC 5208:Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification Version 1.2
    https://www.rfc-editor.org/rfc/rfc5208

  17. RFC 5958:Asymmetric Key Packages
    https://www.rfc-editor.org/rfc/rfc5958

  18. RFC 5480:Elliptic Curve Cryptography Subject Public Key Information
    https://www.rfc-editor.org/rfc/rfc5480

  19. RFC 3279:Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and CRL Profile
    https://www.rfc-editor.org/rfc/rfc3279

  20. RFC 4055:Additional Algorithms and Identifiers for RSA Cryptography for use in the Internet X.509 Public Key Infrastructure Certificate and CRL Profile
    https://www.rfc-editor.org/rfc/rfc4055

  21. RFC 5758:Internet X.509 Public Key Infrastructure: Additional Algorithms and Identifiers for DSA and ECDSA
    https://www.rfc-editor.org/rfc/rfc5758

  22. RFC 1155:Structure and Identification of Management Information for TCP/IP-based Internets
    https://www.rfc-editor.org/rfc/rfc1155

  23. RFC 2578:Structure of Management Information Version 2 (SMIv2)
    https://www.rfc-editor.org/rfc/rfc2578

  24. RFC 2579:Textual Conventions for SMIv2
    https://www.rfc-editor.org/rfc/rfc2579

  25. RFC 2580:Conformance Statements for SMIv2
    https://www.rfc-editor.org/rfc/rfc2580

  26. RFC 4512:Lightweight Directory Access Protocol (LDAP): Directory Information Models
    https://www.rfc-editor.org/rfc/rfc4512

  27. RFC 4517:Lightweight Directory Access Protocol (LDAP): Syntaxes and Matching Rules
    https://www.rfc-editor.org/rfc/rfc4517

  28. RFC 5652:Cryptographic Message Syntax (CMS)
    https://www.rfc-editor.org/rfc/rfc5652

  29. NIST FIPS 180-4:Secure Hash Standard (SHS)
    https://csrc.nist.gov/pubs/fips/180-4/upd1/final

  30. NIST FIPS 202:SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions
    https://csrc.nist.gov/pubs/fips/202/final

  31. OID Repository https://oid-base.com

  32. 3GPP TS 38.331 – NR; Radio Resource Control (RRC); Protocol specification 其中使用 ASN.1 定义 5G RRC 信令消息及大量 OID 引用


分享这篇文章:

上一篇
世界 IPv6 日,不只是个纪念日
下一篇
使用 Forge Actions 拉取 Infisical 机密

人机验证:请刷新页面以加载评论区