我和数字签名、数字证书的故事

概要

这篇文章中,涉及到的概念有:单向加密非对称加密数字签名,可以参考我的另一篇文章:我和加解密、数字签名的故事。

现在浏览器访问,基本都使用HTTPS,HTTPS中涉及到了数字签名、数字证书的内容,为了更好的理解网络请求,在此对数字签名、数字证书的内容进行总结。

在信息安全中,有5个基本要素:

  • 保密性(Confidentiality):信息不被泄漏,通过加密实现;
  • 真实性(Authentication):对信息的来源进行鉴别;
  • 完整性(Integrity):信息不被篡改;
  • 可用性(Availability):在需要信息的时候,能方便的获取;
  • 不可否认性(Non-repudiation):交换信息的双方不能否认交换信息的行为。

加密保证了保密性,数字签名保证了完整性和不可否认性,数字证书保证了真实性。而可用性是显而易见的,比如想通过银行App查看自己的余额,随时都可以登录查询。

数字签名(Digital Signature)

什么是数字签名?
数字签名有2种情况:一种是动词,一种是名词。

  • 动词:表示一个动作,和在合同上签下名字这个动作一样,表示一个动作。
  • 名词:表示一个签名,和在合同上签下的名字一样,只是一个签名而已。

在查看资料时,很容易混淆 “数字签名” 到底是动词,还是名词。比如下面这句话:张三对一份文档进行数字签名,得到一个数字签名。
所以在理解数字签名时,区分 “数字签名” 是动词,还是名词很重要。在上面的那句话中,第一个 “数字签名” 是一个动词,表示签名这个动作;第二个 “数字签名” 是一个名词,表示一个签名。

签名

纸质文档签名,只需要用笔在纸质文档上写下自己的名字,就可以了。如果文档是一份电子文档,怎么对这份文档进行数字签名呢?(数字签名的过程中,涉及到加密等概念,可以参考另一篇文章:我和加解密、数字签名的故事)
我和数字签名、数字证书的故事_第1张图片
签名方拥有一对密钥,称为公钥和私钥,公钥对外公开,私钥自己持有。
对电子文档数字签名的过程如上图所示,步骤为:

  1. 用单向加密算法(比如MD5),对文档进行加密,得到Digest(摘要);
  2. 用私钥对Digest(摘要)进行加密,得到数字签名;
  3. 把文档明文加入新文档;
  4. 把数字签名加入新文档;

经过这4步得到的新文档,就是完成数字签名的新文档。

验证

如何对一份已经数字签名的文档进行验证呢?
我和数字签名、数字证书的故事_第2张图片
验证的过程如上图所示,过程为:

  1. 用同样的单向加密算法(比如MD5),对文档进行加密,得到Digest(摘要)1;
  2. 用公钥对数字签名进行解密,得到Digest(摘要)2;
  3. 比较Digest(摘要)1 和 Digest(摘要)2 是否相同,如果相同,则文档未被篡改;否则文档被篡改。

在数字签名和验证的过程中,用到了单向加密、非对称加密。
单向加密(比如MD5)能保证,文档中任一字符改变,得到的Digest都不同。
非对称加密中,私钥加密的数据,只有对应的公钥才能解密。
基于以上2点,对新文档中文档内容、数字签名的改变,都会导致验证失败。

所以,数字签名能保证信息不被篡改,保证信息的完整性;而又因为私钥是不对外公开的,只由一个人或者一个机构持有,所以保证了不可否认性。


数字证书(Digital Certificate )

什么是数字证书呢?先看看百度百科的定义:

数字证书是指证书认证机构(Certificate Authority,简称CA)发行的一种电子文档,是一串能够表明网络用户身份信息的数字,提供了一种在计算机网络上验证网络用户身份的方式,因此数字证书又称为数字标识。

简单的说,数字证书就是一份电子文档,什么电子文档呢?就是完成了数字签名能确认身份的电子文档,如下图所示:
我和数字签名、数字证书的故事_第3张图片
那证书中的具体内容是什么呢?获取一个网站的数字证书看看:
我和数字签名、数字证书的故事_第4张图片
在证书的详细信息中,有几个重要信息:

  • 颁发者:证书的颁发(创建)机构;
  • 使用者:使用证书的机构;
  • 有效时间:证书有效时间,比如从‎2019‎年‎5‎月‎9‎日 9:22:02到‎2020‎年‎6‎月‎25‎日 13:31:02有效;
  • 公钥:证书公钥,图中的公钥有2048位;
  • 签名哈希算法:对证书内容单向加密,得到摘要(也称指纹)的算法。
  • 签名算法:对摘要(也称指纹)进行加密,得到数字签名的算法。
  • 指纹:对证书内容单向加密的结果。

说明:在图中,指纹信息为“d1f6323db6f2ec81e7023690f49b2d91e0c3993a”。但证书中,并不会直接存储指纹信息,存储的是对指纹信息加密后的数据(这个加密后的数据,就是数字签名)。图中显示为明文,猜想是Window系统证书查看程序,对数字签名进行解密,得到了指纹信息。

数字证书生成

如何生成数字证书呢?
一般是通过向CA申请(一般都要收费)。申请数字证书的步骤如下:

  1. 申请方生成一对公钥、私钥密钥对;
  2. 把公钥发送给CA;
  3. CA对公钥、颁发者、使用者、有效时间等信息单向加密,得到指纹信息;
  4. CA使用它的私钥对指纹进行加密,得到数字签名;
  5. 把公钥、颁发者、使用者、有效时间等明文信息、数字签名放在一份文件中,这份文件就是数字证书。

数字证书验证

数字证书的作用是什么?用来确认身份,从而保证信息的真实性。比如百度网站的数字证书,是用来确认这就是百度,而不是谷歌。
所以数字证书的验证,就是验证数字证书的真实性。

数字证书的验证,涉及到证书链。
从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打开,如下图所示:
我和数字签名、数字证书的故事_第5张图片根证书机构一般不会直接颁发终端证书(end-user),它一般颁发中间证书(intermediates)给中间证书机构,中间证书机构再颁发终端证书(end-user)。

中间证书机构,可以视为根证书机构的代理,可以有很多级。它负责颁发终端证书。
中间证书机构的证书由根证书机构直接颁发,所以系统、浏览器中也会预装一些中间证书。

那怎么验证终端证书(end-user)呢?通过一个具体的证书来看证书是怎么验证的,下图是百度的证书,证书有3级:

我和数字签名、数字证书的故事_第6张图片
百度证书验证步骤如下:

  1. 查看baidu.com证书,是否存在系统种,如果存在,则说明是可信任证书;
  2. 如果baidu.com证书不存在系统种,则查看上一级证书GlobalSign Organization Validation CA - SHA256 - G2是否存在系统中;
  3. 如果系统中,GlobalSign Organization Validation CA - SHA256 - G2证书已经存在,则用GlobalSign Organization Validation CA - SHA256 - G2证书中的公钥去验证baidu.com证书中的数字签名,如果验证通过,则baidu.com证书是可信任的;否则baidu.com证书不可信任。整个验证过程结束。
  4. 如果系统中,没有GlobalSign Organization Validation CA - SHA256 - G2证书呢?则通过baidu.com证书d “授权访问信息”获取上一级证书GlobalSign Organization Validation CA - SHA256 - G2。
  5. 获取到GlobalSign Organization Validation CA - SHA256 - G2证书后,看上一级证书GlobalSign Root CA是否存在系统中。
  6. 如果系统中,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证书也是不可信任的。整个验证过程结束。
  7. 如果GlobalSign Organization Validation CA - SHA256 - G2验证通过,则进入第3步。

所以,证书链的验证是逐级验证的,用上一级证书的公钥,验证证书的数字签名。
最顶级的证书是无须验证的,如果系统中有,就表明是信任;没有就表明不信任,这时整个证书链都是不可信任的。

三级证书验证如下图所示:
我和数字签名、数字证书的故事_第7张图片在三级证书中,每一级证书都有公钥(public key),但证书签名的验证并不是用自身的公钥验证,而是用上一级证书的公钥验证。
比如图中,终端证书(End certificate)签名的验证,需要用中间证书(Intermediates Certificate)的公钥验证,因为终端证书是中间证书的私钥进行签名,所以只能用中间证书的公钥验证;中间证书的验证,需要用根证书(Root certificate)的公钥验证,因为中间证书是根证书的私钥进行签名,所以只能用根证书的公钥进去验证。

这里就产生了2个疑问:

  1. 终端证书的公钥有什么用?
  2. 根证书怎么验证?

先回答第1个问题:终端证书的公钥,在SSL/TLS的验证过程中使用,用来加密通信双方的对称密钥,详细的过程请查询SSL/TLS验证过程。
第2个问题:根证书无须认证,因为根证书默认保存在系统或者浏览器中,是无条件信任的。所以有时候,为了让系统/浏览器信任我们自己颁发的证书,可以把证书手动导入系统中,导入的方式也很简单,打开证书——安装证书即可,如下图:
我和数字签名、数字证书的故事_第8张图片
证书安装的过程也很简单,就是把证书保存在系统指定的位置,而且这个位置一般无法访问,只能通过一定的方式访问。比如刚刚安装的百度证书,就可以通过“certmgr.exe”查看到,如下图:
我和数字签名、数字证书的故事_第9张图片
以上就是我和数字签名、数字证书的全部故事。


参考资料

数字证书原理
证书链-Digital Certificates
什么是数字签名和证书?
HTTPS协议、TLS协议、证书认证过程解析

你可能感兴趣的:(数字签名,数字证书)