命名数据网络 | 证书(Certificate)
命名数据网络 | 证书(Certificate)
参考文档:https://docs.named-data.net/NDN-packet-spec/current/certificate.html
由于签名验证是 NDN 应用程序中的常见操作,因此定义通用证书格式以标准化公钥验证过程非常重要。由于每个 NDN 数据包都经过签名,因此以公钥为内容的数据包在概念上就是证书。但是,单独的数据包规范不足以作为通用 NDN 证书格式的规范,因为后者需要额外的规定。例如,证书遵循特定的命名方案,可能需要包括有效期、撤销信息等。
本文介绍 NDN 证书的命名和结构。
Structure of an NDN certificate
+--------------------------+
| Name |
+--------------------------+
| MetaInfo |
|+------------------------+|
|| ContentType: KEY(2) ||
|+------------------------+|
|+------------------------+|
|| FreshnessPeriod: ~1h ||
|+------------------------+|
+--------------------------+
| Content |
|+------------------------+|
|| Public Key ||
|+------------------------+|
+--------------------------+
| SignatureInfo |
|+------------------------+|
|| SignatureType: ... ||
|| KeyLocator: ... ||
|| ValidityPeriod: ... ||
|| ... ||
|+------------------------+|
+--------------------------+
| SignatureValue |
+--------------------------+
Certificate = DATA-TYPE TLV-LENGTH
Name ; /<IdentityName>/KEY/<KeyId>/<IssuerId>/<Version>
MetaInfo ; ContentType == KEY, FreshnessPeriod required
CertificateContent
CertificateSignatureInfo
SignatureValue
CertificateContent = CONTENT-TYPE TLV-LENGTH SubjectPublicKeyInfo
CertificateSignatureInfo = SIGNATURE-INFO-TYPE TLV-LENGTH
SignatureType
KeyLocator
ValidityPeriod
*CertificateExtension
Name
证书名称由五个部分组成,如下所示:
/<IdentityName>/KEY/<KeyId>/<IssuerId>/<Version>
证书名称以公钥绑定到的身份的名称开头。标识后面跟着一个字面值的 KEY GenericNameComponent,以及 KeyId、IssuerId 和 Version 组件。
证书名称以公钥绑定到的身份的名称开头。标识后面跟着一个字面值的 KEY GenericNameComponent,以及 KeyId、IssuerId 和 Version 组件。
KeyId 是一个不透明的名称组件,用于标识证书名称空间中公钥的实例。KeyId的值由名称空间所有者控制,可以是一个8字节的随机数、证书公钥的 SHA-256 摘要、时间戳或任何其他唯一的数字标识符。
IssuerId 是一个不透明的名称组件,用于标识证书的颁发者。该值由证书颁发者控制,与 KeyId 类似,可以是一 个8 字节的随机数、颁发者公钥的 SHA-256 摘要或任何其他自由形式的标识符。
Version 表示证书的版本号。该组件被编码为 VersionNameComponent,遵循 NDN 命名约定 的修订 1(基于标记的)或修订 3(基于类型的)。
示例:
/edu/ucla/cs/yingdi/KEY/%03%CD...%F1/%9F%D3...%B7/v=1617592200702
\_________________/ \___________/\___________/\______________/
Identity Name KeyId IssuerId Version
MetaInfo
内容类型必须设置为 KEY(2)。
FreshnessPeriod 必须显式指定。推荐值为 3600000(1 小时)。
Content
即为 CertificateContent。
证书的 Content 元素包含公钥的实际位,格式为 DER 编码的 SubjectPublicKeyInfo 结构。
SignatureInfo
证书的 SignatureInfo 元素需要包含 ValidityPeriod 元素。
ValidityPeriod 包含两个 TLV 子元素:NotBefore 和 NotAfter。其中,NotBefore 表示证书生效时间,NotAfter 表示证书过期时间。
它们每个都携带 ISO 8601-1:2019 压缩格式的 UTC 时间戳,不包含最后的“Z”字符(“YYYYMMDDThhmmss”,例如 “20201231T235959”)。
ValidityPeriod = VALIDITY-PERIOD-TYPE TLV-LENGTH
NotBefore
NotAfter
NotBefore = NOT-BEFORE-TYPE TLV-LENGTH IsoDate "T" IsoTime
NotAfter = NOT-AFTER-TYPE TLV-LENGTH IsoDate "T" IsoTime
IsoDate = 8DIGIT ; YYYYMMDD (UTC)
IsoTime = 6DIGIT ; hhmmss (UTC)
Extension
即为 CertificateExtension。
证书可以在其 SignatureInfo 元素中携带 0 个或多个扩展字段。
根据其 TLV-TYPE 编号,扩展可以是关键或非关键的。关键 TLV-TYPE 意味着如果验证器不能识别或解析扩展,则验证器必须拒绝整个证书。相反,如果验证器无法识别具有非关键 TLV-TYPE 的扩展,则可能忽略该扩展。参考一般的 演化规则 来确定 TLV-TYPE 是否是关键的。
TLV-TYPE 号码范围 [256,511] 保留给扩展使用。本文档目前定义了一个扩展名:AdditionalDescription。
CertificateExtension = AdditionalDescription
AdditionalDescription
AdditionalDescription 是非关键扩展名,提供有关证书的附加信息。
该信息表示为一组键值对。key和value都是UTF-8字符串,例如(“Organization”, “UCLA”)。
证书的颁发者可以指定任意的键值对,以提供有关证书的进一步详细信息。
AdditionalDescription = ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
1*DescriptionEntry
DescriptionEntry = DESCRIPTION-ENTRY-TYPE TLV-LENGTH
DescriptionKey
DescriptionValue
DescriptionKey = DESCRIPTION-KEY-TYPE TLV-LENGTH 1*OCTET
DescriptionValue = DESCRIPTION-VALUE-TYPE TLV-LENGTH 1*OCTET