五、证书
证书是一种数据结构,用于传输以下信息:
- 验证证书持有者签发的证书或SPDU的数字签名的公钥(即验证下级证书的数字签名)
- 与公钥相关联的许可
- 证书颁发者的标识符
- 确定证书是否按规定撤销的信息
- 用于颁发者授权公钥和许可之间链接的cryptographic demonstration
cryptographic demonstration有两种形式,据此可将证书分为显式证书和隐式证书。
- 显式证书:如果证书中显式地给出了公钥,那么证书就是显式证书。在这种情况下,cryptographic demonstration由证书上颁发者的签名提供。
- 隐式证书:如果公钥没有显式给出,但可以通过重构函数从证书上的“重构值”和颁发者的公钥得到,那么证书就是隐式证书。在这种情况下,cryptographic demonstration由“签名用这种方式得到的公钥正确验证”的事实提供。
验证方式:
- 每一级的显式证书的数字签名,都需要用它的颁发者证书的公钥进行验证
- 如果链以一个或多个隐式证书结束:可以使用链中最后一个证书中的关联公钥验证已签名SPDU上的签名。
撤销信息有两种形式。应用于证书的撤销信息的类型由证书中的CertificateId字段表示:
- 基于链接:如果CertificateId字段表示选择linkageData,则通过发布linkageData值对应的链接种子值来撤销证书。
- 基于哈希id:如果CertificateId字段表示选择name、binaryId或none,则通过发布证书的哈希值来撤销证书。
证书的数据结构:
class CertificateBase {
Uint8 version; //证书格式的版本
CertificateType type; //证书类型,要么为explicit,要么为implicit
IssuerIdentifier issuer; //证书的颁布者标识符
ToBeSignedCertificate toBeSigned; //证书内容,用来产生或验证下级证书的signature
Signature OPTIONAL signature; //显式证书才有的数字签名,颁发者的toBeSigned的哈希值
}