概要
这篇文章中,涉及到的概念有:单向加密
、非对称加密
、数字签名
,可以参考我的另一篇文章:我和加解密、数字签名的故事。
现在浏览器访问,基本都使用HTTPS,HTTPS中涉及到了数字签名、数字证书的内容,为了更好的理解网络请求,在此对数字签名、数字证书的内容进行总结。
在信息安全中,有5个基本要素:
- 保密性(Confidentiality):信息不被泄漏,通过加密实现;
- 真实性(Authentication):对信息的来源进行鉴别;
- 完整性(Integrity):信息不被篡改;
- 可用性(Availability):在需要信息的时候,能方便的获取;
- 不可否认性(Non-repudiation):交换信息的双方不能否认交换信息的行为。
加密保证了保密性,数字签名保证了完整性和不可否认性,数字证书保证了真实性。而可用性是显而易见的,比如想通过银行App查看自己的余额,随时都可以登录查询。
数字签名(Digital Signature)
什么是数字签名?
数字签名有2种情况:一种是动词,一种是名词。
- 动词:表示一个动作,和在合同上签下名字这个动作一样,表示一个动作。
- 名词:表示一个签名,和在合同上签下的名字一样,只是一个签名而已。
在查看资料时,很容易混淆 “数字签名” 到底是动词,还是名词。比如下面这句话:张三对一份文档进行数字签名,得到一个数字签名。
所以在理解数字签名时,区分 “数字签名” 是动词,还是名词很重要。在上面的那句话中,第一个 “数字签名” 是一个动词,表示签名这个动作;第二个 “数字签名” 是一个名词,表示一个签名。
签名
纸质文档签名,只需要用笔在纸质文档上写下自己的名字,就可以了。如果文档是一份电子文档,怎么对这份文档进行数字签名呢?(数字签名的过程中,涉及到加密等概念,可以参考另一篇文章:我和加解密、数字签名的故事)
签名方拥有一对密钥,称为公钥和私钥,公钥对外公开,私钥自己持有。
对电子文档数字签名的过程如上图所示,步骤为:
- 用单向加密算法(比如MD5),对文档进行加密,得到Digest(摘要);
- 用私钥对Digest(摘要)进行加密,得到数字签名;
- 把文档明文加入新文档;
- 把数字签名加入新文档;
经过这4步得到的新文档,就是完成数字签名的新文档。
验证
如何对一份已经数字签名的文档进行验证呢?
验证的过程如上图所示,过程为:
- 用同样的单向加密算法(比如MD5),对文档进行加密,得到Digest(摘要)1;
- 用公钥对数字签名进行解密,得到Digest(摘要)2;
- 比较Digest(摘要)1 和 Digest(摘要)2 是否相同,如果相同,则文档未被篡改;否则文档被篡改。
在数字签名和验证的过程中,用到了单向加密、非对称加密。
单向加密(比如MD5)能保证,文档中任一字符改变,得到的Digest都不同。
非对称加密中,私钥加密的数据,只有对应的公钥才能解密。
基于以上2点,对新文档中文档内容、数字签名的改变,都会导致验证失败。
所以,数字签名能保证信息不被篡改,保证信息的完整性;而又因为私钥是不对外公开的,只由一个人或者一个机构持有,所以保证了不可否认性。
数字证书(Digital Certificate )
什么是数字证书呢?先看看百度百科的定义:
数字证书是指证书认证机构(Certificate Authority,简称CA)发行的一种电子文档,是一串能够表明网络用户身份信息的数字,提供了一种在计算机网络上验证网络用户身份的方式,因此数字证书又称为数字标识。
简单的说,数字证书就是一份电子文档,什么电子文档呢?就是完成了数字签名能确认身份的电子文档,如下图所示:
那证书中的具体内容是什么呢?获取一个网站的数字证书看看:
在证书的详细信息中,有几个重要信息:
- 颁发者:证书的颁发(创建)机构;
- 使用者:使用证书的机构;
- 有效时间:证书有效时间,比如从2019年5月9日 9:22:02到2020年6月25日 13:31:02有效;
- 公钥:证书公钥,图中的公钥有2048位;
- 签名哈希算法:对证书内容单向加密,得到摘要(也称指纹)的算法。
- 签名算法:对摘要(也称指纹)进行加密,得到数字签名的算法。
- 指纹:对证书内容单向加密的结果。
说明:在图中,指纹信息为“d1f6323db6f2ec81e7023690f49b2d91e0c3993a”。但证书中,并不会直接存储指纹信息,存储的是对指纹信息加密后的数据(这个加密后的数据,就是数字签名)。图中显示为明文,猜想是Window系统证书查看程序,对数字签名进行解密,得到了指纹信息。
数字证书生成
如何生成数字证书呢?
一般是通过向CA申请(一般都要收费)。申请数字证书的步骤如下:
- 申请方生成一对公钥、私钥密钥对;
- 把公钥发送给CA;
- CA对公钥、颁发者、使用者、有效时间等信息单向加密,得到指纹信息;
- CA使用
它的私钥
对指纹进行加密,得到数字签名; - 把公钥、颁发者、使用者、有效时间等明文信息、数字签名放在一份文件中,这份文件就是数字证书。
数字证书验证
数字证书的作用是什么?用来确认身份,从而保证信息的真实性。比如百度网站的数字证书,是用来确认这就是百度,而不是谷歌。
所以数字证书的验证,就是验证数字证书的真实性。
数字证书的验证,涉及到证书链。
从CA申请的证书,能够确认证书申请者的身份。
那CA的身份,怎么确认呢?怎么能确认CA是合法、权威的认证机构,而不是非法的机构呢?
所以CA也需要一份数字证书,用于认证CA是一个合法的CA。
CA的证书由什么机构颁发呢?由它的上一级CA颁发。
上一级CA怎么确认身份呢?同样也需要一个证书。
上一级CA证书由谁颁发呢?由上一级CA自己颁发。
这里涉及到了2个CA机构、3个数字证书,这3个数字证书就构成了一条证书链。
2个证书机构:
- 中间证书机构(intermediates CAs);
- 根证书机构(root CAs)。
3个数字证书:
- 终端证书(end-user),服务器使用的证书,由中间证书机构颁发;
- 中间证书(intermediates),由根证书机构颁发;
- 根证书(root),由根证书机构自己颁发。
根证书机构,全球只有为数不多的几家,比如DigiCert、GeoTrust、GlobalSign、VeriSign等,全球的电子设备对这些根证书机构颁发的证书,无条件的信任(这就是证书信任机制的基础)。只要是这些根证书机构颁发的证书,都无条件信任,都认为是可信任的。
所以这些根证书机构颁发给自己的根证书,也是全球可信任的。信任到什么程度呢?所有的电子设备系统中,都会预装这些根证书。比如Window系统,Android手机、IOS手机系统、浏览器中,都会预装这些根证书。
Window系统中,通过证书管理程序管理证书,可以通过在 “运行”中输入certmgr.msc打开,如下图所示:
根证书机构一般不会直接颁发终端证书(end-user),它一般颁发中间证书(intermediates)给中间证书机构,中间证书机构再颁发终端证书(end-user)。
中间证书机构,可以视为根证书机构的代理,可以有很多级。它负责颁发终端证书。
中间证书机构的证书由根证书机构直接颁发,所以系统、浏览器中也会预装一些中间证书。
那怎么验证终端证书(end-user)呢?通过一个具体的证书来看证书是怎么验证的,下图是百度的证书,证书有3级:
百度证书验证步骤如下:
- 查看baidu.com证书,是否存在系统种,如果存在,则说明是可信任证书;
- 如果baidu.com证书不存在系统种,则查看上一级证书GlobalSign Organization Validation CA - SHA256 - G2是否存在系统中;
- 如果系统中,GlobalSign Organization Validation CA - SHA256 - G2证书已经存在,则用GlobalSign Organization Validation CA - SHA256 - G2证书中的公钥去验证baidu.com证书中的数字签名,如果验证通过,则baidu.com证书是可信任的;否则baidu.com证书不可信任。整个验证过程结束。
- 如果系统中,没有GlobalSign Organization Validation CA - SHA256 - G2证书呢?则通过baidu.com证书d “授权访问信息”获取上一级证书GlobalSign Organization Validation CA - SHA256 - G2。
- 获取到GlobalSign Organization Validation CA - SHA256 - G2证书后,看上一级证书GlobalSign Root CA是否存在系统中。
- 如果系统中,GlobalSign Root CA证书已经存在,则用GlobalSign Root CA证书中的公钥去验证GlobalSign Organization Validation CA - SHA256 - G2证书中的数字签名,如果验证通过,则GlobalSign Organization Validation CA - SHA256 - G2是可信任的;否则GlobalSign Organization Validation CA - SHA256 - G2是不可信任的,所以GlobalSign Organization Validation CA - SHA256 - G2下一级证书baidu.com证书也是不可信任的。整个验证过程结束。
- 如果GlobalSign Organization Validation CA - SHA256 - G2验证通过,则进入第3步。
所以,证书链的验证是逐级验证的,用上一级证书的公钥,验证证书的数字签名。
最顶级的证书是无须验证的,如果系统中有,就表明是信任;没有就表明不信任,这时整个证书链都是不可信任的。
三级证书验证如下图所示:
在三级证书中,每一级证书都有公钥(public key),但证书签名的验证并不是用自身的公钥验证,而是用上一级证书的公钥验证。
比如图中,终端证书(End certificate)签名的验证,需要用中间证书(Intermediates Certificate)的公钥验证,因为终端证书是中间证书的私钥进行签名,所以只能用中间证书的公钥验证;中间证书的验证,需要用根证书(Root certificate)的公钥验证,因为中间证书是根证书的私钥进行签名,所以只能用根证书的公钥进去验证。
这里就产生了2个疑问:
- 终端证书的公钥有什么用?
- 根证书怎么验证?
先回答第1个问题:终端证书的公钥,在SSL/TLS的验证过程中使用,用来加密通信双方的对称密钥,详细的过程请查询SSL/TLS验证过程。
第2个问题:根证书无须认证,因为根证书默认保存在系统或者浏览器中,是无条件信任的。所以有时候,为了让系统/浏览器信任我们自己颁发的证书,可以把证书手动导入系统中,导入的方式也很简单,打开证书——安装证书即可,如下图:
证书安装的过程也很简单,就是把证书保存在系统指定的位置,而且这个位置一般无法访问,只能通过一定的方式访问。比如刚刚安装的百度证书,就可以通过“certmgr.exe”查看到,如下图:
以上就是我和数字签名、数字证书的全部故事。
参考资料
数字证书原理
证书链-Digital Certificates
什么是数字签名和证书?
HTTPS协议、TLS协议、证书认证过程解析