服务器开发程序员必须搞清HTTPS通讯之证书( 二 )

二、PKIPublic Key Infrastructure(PKI) , 中文公钥基础设施 , 由一系列实体组成的集合体 , 用于向客户端提供可信的服务器身份认证 。
X.509PKI的标准规定PKI的设计、实施和运营 , PKI事实上的标准是X.509 。
X.509来自于国际电信联盟电信标准(ITU-T)的X.500标准 , 发展主要历史:

  1. X.209 1988
  2. X.500 1993 , ISO组织接受的目录服务系统标准 , 定义了一个机构如何在全局范围内共享其名字和与之相关的对象 。X.500是分层次的 , 其中的管理域(机构、分支、部门和工作组)可以提供这些域内的用户和资源信息 。在PKI体系中 , X.500被用来惟一标识一个实体 , 该实体可以是机构、组织、个人或一台服务器 。X.500被认为是实现目录服务的最佳途径 , 但X.500的实现需要较大的投资 , 并且比其他方式速度慢;而其优势具有信息模型、多功能和开放性 。
  3. X.509 1993 由国际电信联盟(ITU-T)制定的数字证书标准 , 最初版本公布于1988年 。X.509证书由用户公共密钥和用户标识符组成 。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息 。这一标准的最新版本是X.509 v3 。
三、证书对HTTPS通讯来说 , 核心是理解证书 。证书主要包括:签名、服务器实体信息、CA机构信息 。
1. ASN.1ASN.1是数据结构描述语言 , 由ITU-T定义的标准 , 用来结构化描述证书 。它有两部分:
  1. ISO 8824/ITU X.208 描述信息内的数据、数据类型及序列格式 , 也就是数据的语法;
  2. ISO 8825/ITU X.209 描述如何将各部分数据组成消息 , 也就是数据的基本编码规则 。
    X.509定义了证书应该包含的内容 , 而ASN.1是具体的数据结构 。
ASN.1 原来是X.409的一部分 , 后来独立出来成为一个标准  , 广泛应用于计算机通讯领域 。
2. 证书结构3.2.1 证书的主要结构:Certificate ::= SEQUENCE {tbsCertificateTBSCertificate,signatureAlgorithmAlgorithmIdentifier,# 签名算法signatureBIT STRING# 签名值}SEQUENCE是ASN.1中的一个结构体 , 包括多个属性 。属性还可以嵌套其它的ASN.1结构 。TBSCertificate就是一个SEQUENCE结构 。
3.2.2. TBSCertificate结构:TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, -- 证书版本号 serialNumber CertificateSerialNumber,-- 证书序列号 , 对同一CA所颁发的证书 , 序列号唯一标识证书 signature AlgorithmIdentifier,--证书签名算法标识 issuer Name,--证书发行者名称 , 简称DN validity Validity,--证书有效期 subject Name,--证书主体名称 subjectPublicKeyInfo SubjectPublicKeyInfo,--证书公钥 issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,-- 证书发行者ID(可选) , 只在证书版本2、3中才有 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,-- 证书主体ID(可选) , 只在证书版本2、3中才有 extensions [3] EXPLICIT Extensions OPTIONAL-- 证书扩展段(可选) , 只在证书版本3中才有}3.2.3 签名算法签名算法标识符AlgorithmIdentifier类型也是一个SEQUENCE结构 , 由两个属性构成:
AlgorithmIdentifier ::= SEQUENCE {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algorithm OPTIONAL }3.2.4 issuer 示例Let’s Encrypt:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
3.2.5 validity有效期 , 结构:
Validity ::= SEQUENCE{notBefore Time,notAfterTime}3. CSR服务器实体为了证明自己的身份 , 要向CA机构申请证书 。在申请之前 , 先生成一个CSR(Certificate Signing Request)文件 , 即证书签名请求文件 , 把这个CSR文件发给CA机构 。CA机构使用其根证书私钥签名就生成了证书公钥文件 , 也就是颁发给用户的证书 。
CSR文件包括两部分:
  • 生成证书必须的信息 , 如域名、公钥
  • 服务器实体的证明材料
3.3.1 CSR也采用ASN.1标准描述 , 整体格式是:CertificationRequest ::= SEQUENCE {certificationRequestInfoCertificationRequestInfo,# 证书的请求信息signatureAlgorithmAlgorithmIdentifier,# 签名算法signatureBIT STRING# 签名信息}3.3.2 CertificationRequestInfo结构:CertificationRequestInfo ::= SEQUENCE{versionINTEGER { v1(0)}(v1,...),subjectName,subjectPKInfoSubjectPublicKeyInfo,attributes[0] Attributes}


推荐阅读