Digital Certificate & Digital Signature - tenji/ks GitHub Wiki

数字证书和数字签名

Terminologies

  • CA (Certificate Authority):证书授证中心,即数字证书的申请及签发机关。
  • KPI (Public Key Infrastructure):公钥基础设施,可以理解为利用公钥技术为网络应用提供加密和数字签名等密码服务以及必需的密钥和证书管理体系。

一、数字证书

1.1 现实生活中的证书

在现实生活中,证书顾名思义,就是权限机构颁发的证明。比如英语6级证书,就是教育部门颁发给通过了6级考核的个人的证明,证明这个人的英语能力。我们来看一下这个证书的组成:

  • 被证明人:老王
  • 内容:通过了英语六级
  • 盖章:教育部门的公章或钢印

当老王用这张证书找工作时,用人单位会通过查看证书的各项内容(尤其是公章),来验证证书的合法性和老王的能力。在现实生活中经常有假的6级证书,这些假证书最重要的就是有一个假公章。现实生活中使用法律法规来约束私刻假公章的行为,但是用人单位可能不能十分准确的判断公章是真是假。而数字签字可以来解决该类问题。

1.2 数字证书

数字证书就是通过数字签名实现的数字化的证书(数字证书由公钥、证书主体、数字签名等内容组成,可以说数字证书包含数字签名),在现实生活中公章可以被伪造,但是在计算数字世界中,数字签名是没办法被伪造的

1.3 SSL 中数字证书的作用

  • 身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站;
  • 分发公钥。每个数字证书都包含了注册者生成的公钥。在SSL握手时会通过 Certificate 消息传输给客户端。

二、数字签名

数字签名就是对非对称加密和摘要算法的一种应用,能够确保信息在发布后不会被篡改(摘要算法特性),保证数据的完整性和可信性;同时也可以防止数据被他人伪造(非对称加密算法特性);列如,我们有一段授权文本需要发布时,为了防止中途篡改发布的内容,保证发布文本的完整性,以及文本是由指定的发布者发布的。那么,可以通过摘要算法得到发布内容的摘要,得到摘要之后,发布者使用私钥加密得到密文(签名),这时候将源文本、密文(签名)以及公钥一起发布出去即可。

2.1 数字签名的制作和验证

目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下:

  1. 数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。
  2. 数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名证书内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。

2.2 数字签名 vs 数字信封

数字信封的功能类似于普通信封。普通信封在法律的约束下保证只有收信人才能阅读信的内容;数字信封则采用密码技术保证了只有规定的接收人才能阅读信息的内容。

信息发送者首先利用随机产生的【对称密钥】加密信息(因为非对称加密技术的速度比较慢),再利用接收方的【公钥】加密对称密码,被公钥加密后的对称密钥被称之为数字信封。在传递信息时,信息接收方要解密信息时,必须先用自己的私钥解密数字信封,得到对称密码,才能利用对称密码解密所得到的信息。

数字信封既发挥了对称加密算法速度快、安全性好的优点,又发挥了非对称加密算法密钥管理方便的优点。

数字签名是私钥加密(签名),公钥解密(验证);数字信封是公钥加密,私钥解密;可以这么理解:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

三、X.509标准

...

四、证书结构

数字证书的格式遵循 X.509 标准。X.509 是由国际电信联盟(ITU-T)制定的数字证书标准。X.509 v3 证书数据结构如下:

Certificate证书

Version 版本

Serial Number序列号

Algorithm ID 算法标识

Issuer 颁发者

Validity 有效期

Not Before 有效起始日期

Not After 有效终止日期

Subject 使用者

Subject Public Key Info 使用者公钥信息

Public Key Algorithm公钥算法

Subject Public Key公钥

Issuer Unique Identifier (Optional) 颁发者唯一标识

Subject Unique Identifier (Optional) 使用者唯一标识

Extensions (Optional) 扩展

...

Certificate Signature Algorithm 证书签名算法

Certificate Signature 证书签名

五、证书格式

数字证书体现为一个或一系列相关经过加密的数据文件。常见格式有:

  • 符合 PKI ITU-T X509 标准,传统标准(.DER .PEM .CER .CRT)
  • 符合 PKCS#7 加密消息语法标准(.P7B .P7C .SPC .P7R)
  • 符合 PKCS#10 证书请求标准(.p10 .CSR)
  • 符合 PKCS#12 个人信息交换标准(.pfx *.p12)

当然,这只是常用的几种标准,其中,X509证书还分两种编码形式:

  • X.509 DER (Distinguished Encoding Rules)编码,后缀为:.DER .CER .CRT
  • X.509 BASE64 编码,后缀为:.PEM .CRT

X509 是数字证书的基本规范,而 P7 和 P12 则是两个实现规范,P7 用于数字信封,P12 则是带有私钥的证书实现规范。采用的标准不同,生成的数字证书,包含内容也可能不同。下面就证书包含/可能包含的内容做个汇总,一般证书特性有:

  • 存储格式:二进制还是 ASCII
  • 是否包含公钥、私钥
  • 包含一个还是多个证书
  • 是否支持密码保护(针对当前证书)

5.1 PEM (Privacy Enhanced Mail)

PEM文件可能包含任何东西,包括公钥,私钥或两者都包含,因为PEM文件不是标准。 实际上PEM只是意味着该文件包含一个Base64编码的数据位。

5.2 DER

一般指使用DER格式的证书。

5.3 KEY

一般指PEM格式的私钥文件。

5.4 PFX 或 P12

公钥加密标准 #12 (PKCS#12)可包含所有私钥、公钥和证书。其以二进制格式存储,也称为PFX文件。通常可以将Apache/OpenSSL使用的KEY文件 + CRT文件格式合并转换为标准的 PFX 文件,你可以将 PFX 文件格式导入到微软 IIS 5/6、微软 ISA、微软 Exchange Server 等软件。转换时需要输入 PFX 文件的加密密码。

5.5 JKS

通常可以将Apache/OpenSSL使用的KEY文件 + CRT文件格式转换为标准的Java Key Store (JKS)文件。JKS 文件格式被广泛的应用在基于 Java 的 WEB 服务器、应用服务器、中间件。你可以将 JKS 文件导入到 TOMCAT, WEBLOGIC 等软件。

也就是说,JKS 文件中包含私钥和数字证书

5.6 KDB

通常可以将Apache/OpenSSL使用的KEY文件 + CRT文件格式转换为标准的IBM KDB文件。KDB 文件格式被广泛的应用在 IBM 的 WEB 服务器、应用服务器、中间件。你可以将 KDB 文件导入到 IBM HTTP Server、IBM Websphere 等软件。

六、根证书和子证书

  • 根证书是CA认证中心给自己颁发的证书,是信任链的起始点。 安装根证书意味着对这个CA认证中心的信任;
  • 使用根证书的私钥对其它证书的消息摘要进行加密,生成的证书就是这个根证书管理的子证书;
  • 根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。

七、对称加密与非对称加密

虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。也就是说,对称加密一般用于加密传输内容,而非对称加密一般用于加密需要传输的对称加密密钥

八、证书示例

以下是一个颁发给login.yahoo的X.509证书解码的案例,文件的实际大小大约是1KB。这个证书是由GeoTrust(已经被Verisign收购)签发。所以在签发者栏目中,可以看到“Equifax Secure Certificate Authority” (这家已经被Geotrust收购,Geotrust所有的证书都由这个根证书签发)。在使用者(Subject)中包含多条信息,不过最重要的是通用名(Common Name, CN),因为这个部分是用来和网站的域名相匹配的,同时也包含了RSA的公钥以及Geotrust的签名,所有的SSL证书都采用SHA1 HASH算法计算特征值。

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 368716 (0x5a04c)
Signature Algorithm: sha1WithRSAEncryption
Issuer:C=US,O=Equifax,
OU=Equifax Secure Certificate Authority
Validity
Not Before: Jan 4 17:09:06 2006 GMT
Not After : Jan 4 17:09:06 2011 GMT
Subject: C=US, ST=California, L=Santa Clara,
O=Yahoo! Inc., OU=Yahoo, CN=login.yahoo
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:b5:6c:4f:ee:ef:1b:04:5d:be:70:4a:d8:55:1d:
8a:77:0d:c1:45:00:f5:3b:1a:10:dd:d7:f7:bb:7a:
65:54:7f:60:d2:16:bb:bd:12:a5:78:78:d6:b3:50:
4e:ba:17:48:27:7a:22:6f:2a:7c:1d:a2:36:22:d8:
59:a2:ae:3a:0b:d4:d2:1b:8a:0e:5a:89:a9:e4:9a:
ff:db:3f:04:e2:9b:75:c1:8d:c5:8c:05:a1:f3:b5:
92:5e:a1:44:49:19:e4:90:b4:e9:ef:e4:5d:b2:20:
6d:f9:23:76:b8:b2:d4:af:a3:06:f5:9e:03:8f:b8:
82:05:21:11:25:44:3a:80:05
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Non Repudiation,
Key Encipherment,Data Encipherment
X509v3 Subject Key Identifier:
A0:1E:6E:0C:9B:6E:6A:EB:D2:AE:5A:4A:18:FF:0E:93:
46:1A:D6:32
X509v3 CRL Distribution Points:
URI:http://crl.geotrust/crls/secureca.crl
X509v3 Authority Key Identifier:
keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:
4F:33:98:90:9F:D4
X509v3 Extended Key Usage:
TLS Web Server Authentication,
TLS Web Client Authentication
50:25:65:10:43:e1:74:83:2f:8f:9c:9e:dc:74:64:4e:71:27:
4e:2a:6e:4a:12:7b:4c:41:2e:61:4a:11:0b:41:a6:b1:52:cb:
13:76:b6:45:e4:8d:d4:00:9a:3b:02:c7:82:29:01:a3:ee:7d:
f7:b9:02:88:9d:3e:c3:1c:e6:3d:d3:90:fc:9c:56:db:19:9d:
ab:a8:03:80:7d:c4:e2:c4:09:33:9e:58:5b:77:37:89:59:a3:
86:8e:a1:df:b3:bb:02:ed:21:62:fb:ba:c2:ba:e8:d4:8f:66:
c1:a5:5f:ad:f9:3f:cf:22:9b:17:57:a0:ca:28:c6:76:03:a4:
c4:e7

为了验证这个证书,需要用这个证书签发者的根证书(Geotrust的Equifax Secure Certificate Authority)。由于这个证书是用Geotrust的根证书的私钥来签名的,所以我们可以用Geotrust的公钥来对证书的SHA1哈希值进行解码,然后验证解码后的哈希值是否和证书的哈希值一致。以下是Geotrust根证书的样例:

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 903804111 (0x35def4cf)
Issuer:C=US,O=Equifax,
OU=Equifax Secure Certificate Authority
Validity
Not Before: Aug 22 16:41:51 1998 GMT
Not After : Aug 22 16:41:51 2018 GMT
Subject:C=US,O=Equifax,
OU=Equifax Secure Certificate Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:c1:5d:b1:58:67:08:62:ee:a0:9a:2d:1f:08:6d:
91:14:68:98:0a:1e:fe:da:04:6f:13:84:62:21:c3:
d1:7c:ce:9f:05:e0:b8:01:f0:4e:34:ec:e2:8a:95:
04:64:ac:f1:6b:53:5f:05:b3:cb:67:80:bf:42:02:
8e:fe:dd:01:09:ec:e1:00:14:4f:fc:fb:f0:0c:dd:
43:ba:5b:2b:e1:1f:80:70:99:15:57:93:16:f1:0f:
97:6a:b7:c2:68:23:1c:cc:4d:59:30:ac:51:1e:3b:
af:2b:d6:ee:63:45:7b:c5:d9:5f:50:d2:e3:50:0f:
3a:88:e7:bf:14:fd:e0:c7:b9
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 CRL Distribution Points:
DirName:/C=US/O=Equifax
/OU=Equifax Secure Certificate Authority/CN=CRL1
X509v3 Private Key Usage Period:
Not After: Aug 22 16:41:51 2018 GMT
X509v3 Key Usage:
Certificate Sign, CRL Sign
X509v3 Authority Key Identifier:
keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:
4F:33:98:90:9F:D4
X509v3 Subject Key Identifier:
48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:
98:90:9F:D4
X509v3 Basic Constraints:
CA:TRUE
1.2.840.113533.7.65.0:
0...V3.0c....
58:ce:29:ea:fc:f7:de:b5:ce:02:b9:17:b5:85:d1:b9:e3:e0:
95:cc:25:31:0d:00:a6:92:6e:7f:b6:92:63:9e:50:95:d1:9a:
6f:e4:11:de:63:85:6e:98:ee:a8:ff:5a:c8:d3:55:b2:66:71:
57:de:c0:21:eb:3d:2a:a7:23:49:01:04:86:42:7b:fc:ee:7f:
a2:16:52:b5:67:67:d3:40:db:3b:26:58:b2:28:77:3d:ae:14:
77:61:d6:fa:2a:66:27:a0:0d:fa:a7:73:5c:ea:70:f1:94:21:
65:44:5f:fa:fc:ef:29:68:a9:a2:87:79:ef:79:ef:4f:ac:07:
77:38

如果签发证书的根证书,在浏览器的根信任列表中,浏览器就会主动识别该证书是安全的,反之,浏览器就会提出一个警告。GeoTrust的根证书已经被全球所有主要浏览器:Internet Explorer, Netscape ,Mozila ,Opera, Firefox, Safari安装在缺省的信任根证书列表中,GeoTrust签发的证书被广泛的信任和接受。

九、应用场景

9.1 SSL

SSL连接全过程:

  1. 客户端连接服务端下载数字证书;
  2. 客户端通过数字证书中的数字签名校验证书是否合法,流程如上;
  3. 客户端校验通过之后,生成用于传输内容的对称密钥,每次Socket连接生成的对称密钥都不一样;
  4. 客户端使用公钥对对称密钥进行加密,并传给服务端;
  5. 服务端使用私钥对对称密钥进行解密,获取此次Socket连接对称密钥;
  6. 客户端和服务端开始使用对称密钥进行内容传输。

参考链接