证书知识扫盲贴

摘要(Digest)

摘要是通过对数据内容进行散列得到一个固定长度的密文信息, 数据摘要算法也被称为哈希算法、散列算法。比如我们发布ISO的时候,为了能让用户确认ISO是否完整,会在发布的时候为ISO生成MD5摘要或者SHA256摘要。

我们可以使用命令md5sum为一个文件生成MD5摘要,一个典型的MD5摘要长这样:

64677f381ede975b2d213a24353bde3f

同样使用sha256sum为一个文件生成SHA256摘要,形如:

5763d8f685e649bc0007257fa8c98e606ac7c3abc2fca0d15fcc904b91ede027

数字签名(Digital Signature)

数字签名简单来说就是使用私钥对数据的摘要进行加密,这样拥有你公钥(公钥一般对外公开)的人就可以通过解密签名拿到数据的摘要,通过与收到数据的摘要信息进行对比来判断收到数据是否可靠(1.是不是你发的;2.是不是被修改过)。比如我们有时候会使用GPG对邮件内容进行签名然后发送,就是为了防止别人冒用我们的身份发送邮件。

数字证书(Digital Certificate)

数字签名有一个问题就是比较依赖于公钥的正确性,假如有人恶意冒充你放出了公钥,那他就可以随意欺骗使用了这个公钥的人,所以,为了解决这个问题就出现了一种第三方机构Certificate Authority(简称CA)。

CA这类机构可以简单理解为专门给别人的公钥做担保(代价就是你要付一定的担保费,而且一般不便宜),它拿到你的公钥和你的一些基本信息,然后使用它的私钥给这些信息做签名,生成的文件就是所谓的数字证书。一般情况下,证书跟公钥一样都是对外公开的,这样你下次发送数据给别人的时候,别人就可以先验证你的证书,确认是你以后再重复之前数字签名和摘要检测部分的内容。

一个网站的证书可以通过浏览器进行导出,使用openssl查看其包含的信息。比如google.com的证书信息如下:

hualet@hualet-mi ~ $ openssl x509 -noout -text -in ~/Desktop/google.com.pem 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            4f:4a:4e:cf:8b:0e:89:75:08:00:00:00:00:11:bb:69
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Google Trust Services, CN = GTS CA 1O1
        Validity
            Not Before: Aug 23 10:28:57 2019 GMT
            Not After : Nov 21 10:28:57 2019 GMT
        Subject: C = US, ST = California, L = Mountain View, O = Google LLC, CN = *.google.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:e3:0d:97:6e:a5:cb:29:db:fa:c3:90:1d:ca:b5:
                    68:94:e5:95:61:ce:48:83:e6:fe:d3:9d:c7:13:2f:
                    38:93:74:13:c1:32:1c:e8:0c:8a:35:64:03:f5:79:
                    37:59:df:95:c8:63:88:0c:ce:cc:c5:1a:e7:c2:7b:
                    ab:34:38:a2:47
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                8A:AB:3A:DC:FB:47:EF:38:95:C9:F6:15:38:86:F8:EA:70:76:80:D3
            X509v3 Authority Key Identifier: 
                keyid:98:D1:F8:6E:10:EB:CF:9B:EC:60:9F:18:90:1B:A0:EB:7D:09:FD:2B

            Authority Information Access: 
                OCSP - URI:http://ocsp.pki.goog/gts1o1
                CA Issuers - URI:http://pki.goog/gsr2/GTS1O1.crt

            X509v3 Subject Alternative Name: 
                DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com, DNS:*.crowdsource.google.com, DNS:*.g.co, DNS:*.gcp.gvt2.com, DNS:*.gcpcdn.gvt1.com, DNS:*.ggpht.cn, DNS:*.gkecnapps.cn, DNS:*.google-analytics.com, DNS:*.google.ca, DNS:*.google.cl, DNS:*.google.co.in, DNS:*.google.co.jp, DNS:*.google.co.uk, DNS:*.google.com.ar, DNS:*.google.com.au, DNS:*.google.com.br, DNS:*.google.com.co, DNS:*.google.com.mx, DNS:*.google.com.tr, DNS:*.google.com.vn, DNS:*.google.de, DNS:*.google.es, DNS:*.google.fr, DNS:*.google.hu, DNS:*.google.it, DNS:*.google.nl, DNS:*.google.pl, DNS:*.google.pt, DNS:*.googleadapis.com, DNS:*.googleapis.cn, DNS:*.googlecnapps.cn, DNS:*.googlecommerce.com, DNS:*.googlevideo.com, DNS:*.gstatic.cn, DNS:*.gstatic.com, DNS:*.gstaticcnapps.cn, DNS:*.gvt1.com, DNS:*.gvt2.com, DNS:*.metric.gstatic.com, DNS:*.urchin.com, DNS:*.url.google.com, DNS:*.wear.gkecnapps.cn, DNS:*.youtube-nocookie.com, DNS:*.youtube.com, DNS:*.youtubeeducation.com, DNS:*.youtubekids.com, DNS:*.yt.be, DNS:*.ytimg.com, DNS:android.clients.google.com, DNS:android.com, DNS:developer.android.google.cn, DNS:developers.android.google.cn, DNS:g.co, DNS:ggpht.cn, DNS:gkecnapps.cn, DNS:goo.gl, DNS:google-analytics.com, DNS:google.com, DNS:googlecnapps.cn, DNS:googlecommerce.com, DNS:source.android.google.cn, DNS:urchin.com, DNS:www.goo.gl, DNS:youtu.be, DNS:youtube.com, DNS:youtubeeducation.com, DNS:youtubekids.com, DNS:yt.be
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.2
                Policy: 1.3.6.1.4.1.11129.2.5.3

            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://crl.pki.goog/GTS1O1.crl

            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 63:F2:DB:CD:E8:3B:CC:2C:CF:0B:72:84:27:57:6B:33:
                                A4:8D:61:77:8F:BD:75:A6:38:B1:C7:68:54:4B:D8:8D
                    Timestamp : Aug 23 11:29:00.456 2019 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:DD:35:97:5B:D6:C7:18:D2:6D:9F:72:
                                74:21:3F:07:0D:DB:EA:6E:CE:3E:4D:5D:BC:0C:9E:F3:
                                B0:2B:E5:FF:8B:02:20:37:6F:58:D1:C4:DA:B4:96:32:
                                AA:C3:A9:D1:AB:41:F1:63:40:7E:CC:B6:9F:C5:0E:10:
                                9A:64:34:A1:2F:EB:C7
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 74:7E:DA:83:31:AD:33:10:91:21:9C:CE:25:4F:42:70:
                                C2:BF:FD:5E:42:20:08:C6:37:35:79:E6:10:7B:CC:56
                    Timestamp : Aug 23 11:29:00.666 2019 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:02:21:00:9E:3A:1F:9F:BE:39:88:85:D9:6F:49:
                                EB:4F:C1:CC:F3:30:A0:B0:6E:77:56:D6:AE:CE:11:FD:
                                DC:1C:53:C0:BD:02:21:00:94:95:D7:C1:64:A8:AD:05:
                                28:E3:42:CB:5D:67:83:33:16:9B:03:BB:11:2A:8D:77:
                                C7:1C:38:8A:B1:E2:F7:78
    Signature Algorithm: sha256WithRSAEncryption
         9c:cb:cb:b1:db:ba:6a:76:72:49:34:b5:56:fb:c3:91:39:a7:
         be:62:3f:f2:c2:69:98:78:c0:e5:e4:64:ed:cc:3c:16:25:74:
         e0:aa:6a:67:e7:b1:fd:ac:40:9a:f2:45:10:86:ea:69:2f:2c:
         9b:b8:74:38:a5:ce:52:56:cf:f8:46:9a:b6:87:24:e4:00:db:
         e5:6a:4a:d7:98:db:92:ae:27:e5:ba:08:38:06:fc:01:51:26:
         78:24:68:b6:58:13:d2:2e:de:ec:85:31:70:db:48:d4:5b:58:
         68:09:a1:c5:01:bf:b6:a6:8c:1f:87:ac:2f:61:59:be:d6:4d:
         46:2a:bc:45:05:8d:98:4d:a4:bb:93:b6:67:a2:56:1b:8b:8c:
         d1:22:4e:15:9a:05:15:ef:78:3d:05:c2:43:1a:97:15:6f:54:
         58:3d:ae:d5:fb:a0:1f:a3:f7:da:d8:fe:3f:70:2c:27:a6:f9:
         e9:00:a3:85:63:7e:35:90:77:51:e2:72:34:14:33:fd:1b:b2:
         bb:91:29:65:9f:20:6a:e9:14:b1:f8:02:1f:99:8b:66:30:b8:
         02:25:11:3d:b0:f8:6e:ed:88:83:1b:5a:eb:10:8a:a6:6d:4a:
         5f:cc:e2:54:bd:60:6f:7a:7a:02:61:14:11:f2:2e:5c:a1:af:
         71:7b:92:0e

证书链 (Certificate Chain)

那数字证书的真伪如何验证呢?答案是用CA签发机构的证书来进行验证。一般情况下,CA机构会给自己也签发一个证书,就是所谓的根证书。然后使用这个证书相应的私钥给你签发证书,同时在签发的证书中记录签发这个证书所使用的证书信息。比如上面google.com使用的证书中

Issuer: C = US, O = Google Trust Services, CN = GTS CA 1O1

这行。

在实际情况下,考虑到根证书密钥的重要性(一旦根证书的密钥丢了,这个CA机构基本上也就完蛋了),但是签发证书又需要用到私钥,所以CA机构除了给自己签一个根证书外,还会再用根证书给自己签几个intermediate证书作为根证书的代理,用来签发证书。这样,就算其中某一个或几个intermediate证书的私钥泄露,也能规避倒闭的风险……

所以,总结来说,一般的证书结构有三层:网站证书 -> intermediate 证书 -> 根证书,网站证书由intermediate证书来验证,intermediate证书由根证书来验证,根证书一般会作为一个终极信任节点被操作系统或者浏览器内置,最终通过这么一级一级的验证形成一个信任链。

上面给谷歌签发证书使用的就是一个intermediate证书GTS CA 1O1,这个证书的根证书是内置在系统中的GlobalSign Root CA - R2证书。

有效证书

证书一般都有一个有效期,在有效期内的证书才可以被信任,否则就是一个无效证书。除此之外,还有一个概念叫证书吊销列表(Certificate Revocation List, CRL),这个列表简单来说就是CA机构颁发的一个黑名单,用来让一个证书在有效期内也可以被无效。与证书签发者信息一样地,CA机构在签发证书的时候也会在证书中包含这个内容,用来让浏览器进行检查。在上面的例子中,

            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://crl.pki.goog/GTS1O1.crl

这几行中的URI所指向的文件内容http://crl.pki.goog/GTS1O1.crl就是这个给谷歌签发证书的intemediate证书的吊销列表。

发表评论

电子邮件地址不会被公开。 必填项已用*标注