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