数字证书
摘要
有时,我们想下载安装某个软件,在运行setup.exe时,会收到一个安全警告:“你想允许来自未知发布者的此应用对你的电脑进行更改吗?”为什么Windows可以判断出发布者未知?这是因为Windows使用了一种称为Authenticode的技术,在系统内部预置了数字证书(digital certificates)。下文将从数字证书概述、数字证书的构成及原理、数字证书的应用及分类三方面展示调研结果。
1. 数字证书概述
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet 上验证通信实体身份的方式。它是由权威机构——CA 机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份,确保网上传递信息的机密性、完整性及交易的不可抵赖性。
2. 数字证书的构成及原理
数字证书(digital certificates)的格式一般遵循X.509标准,X.509标准有v1,v2,v3版,不同版本号的证书包含的信息略有不同。以下截取了Anaconda安装包的数字证书:
其中比较重要的信息如下:
-
X.509版本号(Version):指出该证书使用了哪种版本的X.509标准。
-
证书的序列号(Serial Number):由CA给予每一个证书分配的唯一的数字型编号,当证书被取消时,实际上是将此证书序列号放入由CA签发的CRL(Certificate Revocation List证书作废表,或证书黑名单表)中。这也是序列号唯一的原因。
-
签名算法(Algorithm ID):用来指定CA签署证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法。
-
颁发者(Issuer):证书发布者,是签发该证书的实体唯一的CA的X.500名字。使用该证书意味着信任签发证书的实体。(注意:在某些情况下,比如根或顶级CA证书,发布者自己签发证书)
-
证书的有效期(Validity):证书起始日期和时间以及终止日期和时间;指明证书在这两个时间内有效。
-
使用者(Subject):证书持有人唯一的标识符(或称DN-distinguished name)这个名字在 Internet上应该是唯一的。DN由许多部分组成,看起来象这样:
E = dmason@anaconda.com
CN = Anaconda, Inc.
O = Anaconda, Inc.
L = Austin
S = Texas
C = US
这些信息指出该科目的通用名、组织单位、组织和国家或者证书持有人的姓名、服务处所等信息。
-
证书持有人的公钥(Public key):包括证书持有人的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数。
-
指纹以及指纹算法(Thumbprint, Thumbprint algorithm):用来保证证书的完整性,确保证书没有被修改过。
其原理是:在发布证书时,发布者根据指纹算法计算整个证书的hash值(指纹),然后使用发布者的私钥用签名算法(Signature algorithm)对hash值做加密。加密后的指纹和证书放在一起,颁发给使用者。使用者在打开证书时,首先用发布者的公钥解密,再根据指纹算法计算一下证书的hash值,如果和刚开始的hash值对得上,就说明证书没有被修改过。因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。
特别说明:数字签名
由数字证书的构成可见,数字签名与数字证书密切相关。截取Anaconda安装包的数字签名如下:
数字签名是非对称加密算法RSA的一个重要应用。它使用两个不同的密钥:公钥和私钥,称为“密钥对”。私钥只对其所有者是已知的,并且必须保持安全,而公钥则对任何人可见。如果一个密钥用于加密,则另一个密钥必须用于解密。在数字签名中,私钥用于生成签名,公钥用于验证签名。
下面以软件发布过程中的对软件的数字签名(也称“代码签名”,Code Signing)为例,来说明数字签名的签名和验证过程。
(一)数字签名的签名过程:
-
签名软件对要签名的软件创建hash;
-
使用发布者的私有密匙来加密软件的hash;
-
被加密的hash和发布者的数字证书被插入到要签名的软件。
(二)数字签名的验证过程:
-
用户对要验证的软件创建hash;
-
使用发布者的公共密匙来解密被加密的hash;
-
比较解密的hash和新获得的hash,如果匹配说明签名是正确的,软件没有被修改过。
3. 数字证书的应用及分类
基于数字证书的应用角度分类,数字证书可以分为以下几种:
3.1 服务器证书
服务器证书被安装于服务器设备上,用来证明服务器的身份和进行通信加密。服务器证书可以用来防止欺诈钓鱼站点。
在服务器上安装服务器证书后,客户端浏览器可以与服务器证书建立SSL连接,在SSL连接上传输的任何数据都会被加密。同时,浏览器会自动验证服务器证书是否有效,验证所访问的站点是否是假冒站点,服务器证书保护的站点多被用来进行密码登录、订单处理、网上银行交易等。
最新的高端SSL证书产品是扩展验证(EV)SSL证书。在IE7.0、FireFox3.0、Opera9.5等新一代高安全浏览器下,使用扩展验证VeriSign(EV)SSL证书的网站的浏览器地址栏会自动呈现绿色,从而清晰地告诉用户正在访问的网站是经过严格认证的。
SL证书还有企业型SSL证书(OVSSL) 及域名型证书(DVSSL)。
3.2 电子邮件证书
电子邮件证书可以用来证明邮件地址的真实性,并可以确信该邮件从被发出后没有被篡改过。
3.3 个人证书
用以验证个人的身份,用户可以利用个人专属代替用户名和密码登陆到需要身份验证的服务器、进行加密的电子邮件传送等。
3.4 代码签名证书
通过对代码的数字签名来标识软件来源以及软件开发者的真实身份,保证代码在签名之后在网络传输过程中不被恶意篡改。使用户在下载已经签名的代码时,能够有效的验证该代码的可信度。
以微软代码为例,为了保证微软Windows系统的安全和用户安全,微软推出了Microsoft Authenticode技术,即微软认证码技术,此技术保证了只有使用Windows的受信任的根证书颁发机构颁发的代码签名证书对软件代码数字签名后才允许在Windows上运行,从而保证了软件代码来自真实的发行者和保证软件代码没有被非法篡改。软件代码数字签名仍然采用PKI双钥技术,整个数字签名过程如下所示:
软件开发商在自己电脑上生成私钥 (.pvk) 和证书请求文件 (CSR)提交WoSign,同时提交有关身份证明文件(如营业执照和第三方证明文件等)给WoSign查验,WoSign验证身份后用自己的私钥给CSR文件签名后生成代码签名证书,也就是公钥(.spc)给软件开发商。这样就完成了证书的申请和颁发。
软件开发商用代码签名工具 (如:SignCode.exe)给要签名的代码生成一个Hash表,再用其私钥加密Hash表产生认证摘要,接着就把认证摘要连同其公钥与软件代码一起打包生成签名后的新的软件代码,软件开发商就可以把已经签名的代码放到网上发行了。
最终用户从网上下载已经签名的代码时,浏览器会从签名代码中解读出其签名证书(公钥)和Hash表摘要,并与Windows的受信任的根证书相比较查验公钥证书的有效性和合法性,验证签名证书正确后,就可以确认此代码确实是来自真实的软件开发商。
接着,再使用签名时使用的同样算法对软件代码生成一个Hash表,并使用公钥也同样生成一个Hash表认证摘要,比较从代码中解包出来的Hash表认证摘要与生成的Hash表认证摘要是否一致,如果一致,则表明此代码在传输过程中未有任何修改,从而可以确认代码的一致性。
3.5 CA与系统根证书
CA就是证书颁发机构,因为证书颁发机构关系到所有互联网通信的身份安全,因此一定要是一个非常权威的机构。所以这样的专门管理和颁发证书的机构就是CA机构。
CA自身的数字证书在我们操作系统刚安装好的时候,这些CA自身的数字证书就已经被微软或者其它操作系统的开发机构安装在操作系统中了。而CA的公钥就包含在其中。这样,CA就可以通过自身的私钥对发布的数字证书进行签名,而在客户端就能够用对应的公钥来对其进行解密。
微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了,并且设置为操作系统信任的数字证书。
CA证书可以具有层级结构,CA建立自上而下的信任链,下级CA信任上级CA,下级CA由上级CA颁发证书并认证。仍以Anaconda的安装包为例,它的CA信任链如下图:
如果说CA保证互联网交易安全的根本保证,那么系统根证书就是个人PC安全的根本保证。系统根证书里保存了受信任的CA证书的根证书,用户验证一个数字证书的正确性都是从系统根证书开始的。
如上图中:Anaconda, Inc.的证书由DigiCert SHA2 Assured ID Code Signing CA这个CA来验证。而DigiCert SHA2 Assured ID Code Signing CA由系统根证书DigiCert Assured ID Root CA来验证。
在windows系统中在开始的搜索中直接键入:certmgr.msc,就可以打开证书查看器查看系统根证书,如果系统根证书被篡改,系统的安全性就受到威胁。