4.2 数字证书
一般来说,数字证书是一种由一个可信任的权威机构签署的信息集合。在不同的应用中有不同的证书,如公钥证书(Public Key Certificate,PKC)、PGP证书、SET证书等。这里只介绍公钥证书PKC,如果不是特别注明,下文中出现的数字证书均是指公钥数字证书。
数字证书常常被类比为用户在网络上的身份证。现实生活中的身份证由公安局统一颁发。因为公安局在颁发身份证时会进行全面检查,人们可以根据身份证上的姓名、出生日期、住址等信息来辩识身份证所有者的身份。
公钥证书主要用于确保公钥及其与用户绑定关系的安全,一般包含持证主体身份信息、主体的公钥信息、CA信息以及附加信息,再加上用CA私钥对上述信息的数字签名。目前应用最广泛的证书格式是国际电信联盟(International Telecommunication Union,ITU)制定的X.509标准中定义的格式。
X.509最初是在1988年的7月3日发布的,版本是X.509 v1,当时是作为ITU X.500目录服务标准的一部分。在此之后,ITU分别于1993年和1995年进行过两次修改,分别形成了X.509 版本2 (X.509 v2)和版本3 (X.509 v3),其中v2证书并未得到广泛使用。
4.2.1 证书格式
X.509三个版本的证书格式如图4-1所示。与X.509 v1相比,v2 版引入了主体和颁发者唯一标识符的概念,以解决主体和/或签发人名称在一段时间后可能重复使用的问题。大多数证书文档都极力建议不要重复使用主体或签发人名称,而且建议证书不要使用唯一标识符。X.509 v3 支持扩展的概念,因此任何人均可定义扩展并将其纳入证书中。
IETF针对X.509在因特网环境中的应用问题,制定了一个作为X.509标准子集的RFC 2459,后又升级到RFC 3280,最新的是2008年发布的RFC 5280,从而使X.509在因特网中得到了广泛应用。
图4-1 X.509证书格式
证书的各字段说明如下:
● 版本号(version):指明X.509证书的格式版本号,目前的值只有0、1、2,分别代表v1、v2和v3。
● 序列号(serial number):指定由CA分配给证书的唯一的数字型标识符。当证书被取消时,实际上是将此证书的序列号放入由CA签发的证书撤销列表(Certificate Revocation List,CRL)(格式如图4-7所示)中,这也是序列号唯一的原因。
● 签名算法标识符(signature algorithm identifier):用来指定由CA签发证书时所使用的公开密钥密码算法和签名算法,由对象标识符加上相关参数组成。该标识符须向国际知名标准组织(如ISO)注册。
● 颁发者名称(issuer name):用来标识签发证书的CA的X.500 DN(Distinguished Name)名字,包含国家、省市、地区、组织机构、单位部门和通用名。
● 有效期(period of validity):指定证书的有效期,包含证书开始生效的日期和时间以及失效(终止)的日期和时间。每次使用证书时,必须要检查证书是否在有效期内。
● 主体名称(subject name):指定证书持有者的X.500唯一名字,包括国家、省市、地区、组织机构、单位部门和通用名,还可包括Email地址等个人信息等。此字段必须是非空的,除非在扩展项中使用了其他的名字形式。
● 主体的公钥信息(subject’s public-key information):公钥信息包括证书持有者的公开密钥的值、公开密钥使用的算法标识符以及相关参数。
● 颁发者唯一标识符(issuer unique identifier):证书颁发者的唯一标识符,属于可选字段,是在第2版中增加的。此域用于同一个X.500名字多于多个认证机构时,用1比特字符串来唯一标识颁发者的X.500名字。该字段在实际应用中很少使用,并且不被RFC 2459推荐使用。
● 主体唯一标识符(subject unique identifier):主体(持有证书者)唯一标识符在第2版的标准中增加了X.509证书定义,为可选字段。此域用于同一个X.500名字对于多个证书持有者时,用1比特字符串来唯一标识证书持有者的X.500名字。
● 颁发者签名(signature):证书签发机构对上述证书内容的签名,包括签名算法(signature Algorithm)及参数和加密的Hash值(signatureValue)。
扩展项是可选字段,每一个扩展项包括三部分:扩展类型(extnID)、关键/非关键(critical)、扩展字段值(extnValue)。其中,extnID表示一个扩展项的OID,critical表示这个扩展项是否是关键的,extnValue表示这个扩展项的值(字符串类型)。
扩展部分包括以下常见扩展项:
● 颁发者密钥标识符(authority key identifier):证书所含密钥的唯一标识符,用来区分同一证书拥有者的多对密钥(如在不同时间段内使用不同的密钥)。RFC 2459要求除签证机构CA的证书以外的所有证书都要包含此字段。
● 密钥使用(key usage):一个比特串,指明(限定)证书的密钥可以完成的功能或服务,如:证书签名、数据加密等。如果某一证书将KeyUsage扩展标记为“关键”,而且设置为“keyCertSign”,则在 SSL 通信期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥只能用于证书签名,而不应该用于SSL。
● CRL分布点(CRL distribution points):指明证书注销列表的发布位置。RFC 2459推荐将该扩展字段设置为“非关键”扩展项。
● 私钥使用期限:指明证书中与公钥相联系的私钥的使用期限,它也用“不早于(notBefore)”和“不晚于(notAfter)”来限定使用的时间(仅允许一般的时间表示法)。若此项不存在时,公私钥的使用期是一样的。RFC 2459反对使用该扩展项。
● 证书策略:用于标识一系列与证书颁发和使用相关的策略,由对象标识符和限定符组成。如果该扩展项被标识为关键项,则在实际应用中就必须遵照所标识的策略,否则证书就不能使用。考虑到互操作性,RFC 2459不推荐使用该扩展项。
● 策略映射:表明两个CA域之间的一个或多个策略对象标识符的等价关系,仅当证书的主体也是一个证书颁发机构(CA)时才使用该扩展项,因此它仅存在于CA的证书中。
● 主体别名(subject alternative name):指明证书拥有者的别名,如电子邮件地址、IP地址等,别名是和DN绑定在一起的。
● 颁发者别名(authority alternative name):指明证书颁发者的别名,如电子邮件地址、IP地址等,但颁发者的DN必须出现在证书的颁发者字段。
● 主体目录属性:指明证书拥有者的一系列属性,可以使用这一扩展项来传递访问控制信息。
RFC 5280将上述证书内容分为三部分:tbsCertificate、signatureAlgorithm、signatureValue,用ASN.1(Abstract Syntax Notation One)描述证书的数据结构,如图4-2所示。其中,tbsCertificate包括subject和issuer的名字,与subject相关的public key和有效期,以及其他相关信息;signatureAlgorithm包含了CA用来签署该证书的识别码(包含签名算法,可选的签名算法参数),[RFC 3279]、[RFC 4055]和[RFC 4491]给出了标准支持的签名算法,但也可以采用其他签名算法;signatureValue包含对tbsCertificate部分(用ASN.1 DER编码)的数字签名,此时tbsCertificate作为签名函数的输入,该签名值使用比特串(BIT STRING)编码。为了生成该签名,CA需要对tbsCertificate中的字段进行有效性判断,特别是对证书中的public key与subject的关联性进行有效性判断。signatureValue一般放在证书的末尾,由CA签署生成。
图4-2 RFC 5280定义的数字证书结构
图4-2 RFC 5280定义的数字证书结构(续图)
CA证书一般采用ASN.1制定的编码规则进行编码。ASN.1提供了多种数据编码方法,包括BER(Basic Encoding Rules)、CER(Canonical Encoding Rules)、DER(Distinguished Encoding Rules)、PER(Packed Encoding Rules)和XER(XML Encoding Rules)等。这些方法规定了将数字对象转换成应用程序能够处理、存储和网络传输的二进制编码形式的一组规则。其中,DER是二进制编码,因此用DER编码的证书文件是不可读的。
此外,保密邮件的编码标准PEM(Privacy Enhanced Mail)编码也被用来给CA证书编码。著名开源SSL软件包OpenSSL使用的CA证书PEM编码就是在DER编码基础上进行Base64编码,然后添加一些头尾信息组成的。
目前,证书文件主要有三种:X.509证书、PKCS#12证书和PKCS#7证书。其中,X.509证书是最经常使用的证书,它仅包含公钥信息而没有私钥信息,是可以公开进行发布的,所以X.509证书对象一般都不需要加密。
X.509证书的格式通常如下:
除了“------BEGIN CERTIFICATE------”和“------END CERTIFICATE------”首尾格式,还有其他的首尾格式符,如“------BEGIN X.509 CERTIFICATE------”与“------END X.509 CERTIFICATE------”,“------BEGIN TRUSTED CERTIFICATE------”与“------END TRUSTED CERTIFICATE------”等。
在Windows系统中,X.509证书文件的后缀名经常是DER、CER,都可以被文件系统自动识别。对于OpenSSL来说,证书文件的后缀通常为PEM。
PKCS#12证书不同于X.509证书,它可以包含一个或多个证书,并且还可以包含证书对应的私钥。PKCS#12的私钥是经过加密的,密钥由用户提供的口令产生。因此,在使用PKCS#12证书的时候一般会要求用户输入密钥口令。PKCS#12证书文件在Windows系统中的后缀名是PFX。
PKCS#7(RFC 2315)可以封装一个或多个X.509证书或者PKCS#6证书(PKCS#6是一种不经常使用的证书格式)、相关证书链上的CA证书,并且可以包含CRL信息。与PKCS#12 证书不同的是,PKCS#7不包含私钥信息。PKCS#7可以将验证证书需要的整个证书链上的证书都包含进来,从而方便证书的发布和正确使用。这样就可以直接把PKCS#7证书发给验证方验证,而无须把以上的验证内容一个一个发给接书方。PKCS#7证书文件在Windows系统中的后缀名是P7B。
很多系统,如Web浏览器,为了便于证书的管理,提出了“证书指纹(thumbprint)”的概念。所谓“证书指纹”是指对证书全部编码内容(也就是证书文件)进行散列运算得到的散列值,也就是证书的数字指纹(参见3.1.1节)。所使用的散列函数因系统而异,如IE浏览器、360浏览器默认用SHA-1计算指纹(如图4-3所示),而Google的Chrome浏览器默认情况下分别计算了SHA-1和SHA256指纹。利用证书指纹,系统可以比较容易地从证书库中检索到一个证书,此外指纹还可以用于检测一个证书是否被篡改。需要注意的是,证书指纹并不是证书的一部分,它的作用也与证书中的证书签名有所不同。
图4-3 360浏览器中的证书指纹
图4-4显示的是从Windows 10系统中将一个证书导出到一个文件的对话框,用户需要选择证书文件的格式。
图4-4 从Windows 10系统中导出证书到文件中
图4-5是微软Windows操作系统中自带的一个数字证书,其中“签名算法”对应的值“md5RSA”表明签名时使用md5算法产生哈希值,并利用RSA公开密钥密码算法进行数字签名;“公钥”项的值“RSA(2048 Bits)”指的是证书所有人的公钥是经由RSA算法产生的,公钥的长度为2 048位。
图4-5 一个典型的数字证书
用户通过认证中心申请到数字证书时,将获得与数字证书相对应的私钥。查看证书的“常规”选项卡,可以看到“您有一个与该证书对应的私钥”的标识,如图4-6所示。与数字证书对应的用户私钥必须严格保密,因为相应的私钥将被直接用于标识用户身份。“常规”选项卡还指明了证书的用途、证书的主体以及证书的颁发者等信息。
数字证书可以被导出,方便在多台主机上使用。如果主机中包含与数字证书相对应的私钥信息,需要考虑是否导出私钥。如果选择“是,导出私钥”选项,即将私钥同数字证书一起导出。用户可以将数字证书连同私钥一起导入其他主机,进而在相应主机上进行数字签名等需要私钥才能完成的操作。如果选择“不,不要导出私钥”选项,则导出的数字证书不需要进行安全防护,因为数字证书中的公钥等信息都是可以公开的。用户可以将不包含私钥的数字证书发送给其他用户从而告知自己的公钥。
图4-6 有对应私钥的数字证书
4.2.2 CRL格式
X.509标准定义的证书撤销列表(CRL)格式如图4-7所示。图中所示的是版本2的CRL格式,与版本1相比,差别在于版本2中增加了CRL条目扩展项和CRL扩展项。CRL的各字段说明如下。
图4-7 证书撤销列表(CRL)格式
● 版本号:指明X.509 CRL的版本号。在版本1中,此字段是可选的,而版本2是必需的。
● 签名算法标识符:用来指定由签发CRL所用的公开密钥密码算法和签名算法,由对象标识符加上相关参数组成。
● 颁发者名称:用来标识签发CRL的CA的X.500 DN(Distinguished Name)名字,包含国家、省市、地区、组织机构、单位部门和通用名。
● 本次更新时间:CRL本次发布的时间(日期/时间)。
● 下次更新时间:CRL下一次将发布的时间(日期/时间)。
● 撤销证书:包括被撤销的用户证书的序列号和撤销时间(日期/时间),其中撤销时间是可选的。
● CRL条目扩展项:同证书版本3中的扩展项一样,版本2的CRL条目也可以使用4个扩展项,以使CA为撤销证书提供更多的信息。这4个扩展项解释如下。
① 原因代码:表明撤销该证书的原因,如密钥泄露、CA损坏、证书冻结、人员调离等。
② 冻结指示代码:标识证书被临时冻结,并描述证书冻结时所进行的操作。此项为非关键扩展项。
③ 证书颁发者:指明与间接CRL有关的证书颁发者的名称。如果指明了该扩展项,则RFC 2459强制要求将该扩展项标记为关键项。
④ 无效日期:指出一个证书不再有效的时间。此项为非关键扩展项。
● CRL扩展项:版本2 CRL定义了以下5个CRL扩展项,分别如下所述。
① 机构密钥标识符:标识CA签名CRL所用的密钥,用于区别CA使用的多个密钥。RFC 2459强制要求使用此项。
② 颁发者别名:指明证书颁发者的别名,并支持颁发者有多个别名(如IP地址、电子邮件地址)。RFC 2459建议当颁发者有别名时使用此扩展项,但并不强制要求将其作为关键项。
③ CRL号:指明本CRL唯一的序列号(单调递增的正整数)。RFC 2459建议使用此扩展项。
④ 增量CRL指示符:指明本CRL是一个增量CRL,而不是基本CRL。RFC 2459强制要求:如果使用了此扩展项,就应该将其标记为关键项。
⑤ 颁发分布点:指明一个CRL的CRL分布点的名称以及在相应CRL中的证书类型(如用户的撤销证书或CA的撤销证书等),并指明一个CRL是不是一个间接CRL。RFC 2459强制要求:如果使用了此扩展项,就应该将其标记为关键项。
CRL由CA签发,可以通过多种方式发布,如发布到目录服务器中、利用Web方式发布或通过电子邮件方式发布。