证书和私钥

发布时间 2024-01-12 14:46:35作者: 桓公子

转载:原文链接

在我们日常生活中,经常和电子证书、签名打交道。最常见的就是Https协议用到的TLS/SSL证书。证书的知识实在是太多,这篇文章的目的不是让各位把证书弄懂,而是提供一个方向、名词,供大家去深究。

证书、公钥、私钥、CSR的关系

私钥,即加密的密钥,证书所使用的私钥是非对称加密中的私钥。常见的有RSA和EC(椭圆曲线)。通过密钥,我们可以生成公钥。可以实现密钥签名、公钥验证,公钥加密、密钥解密等场景。CSR证书签发请求,是包含了公钥和证书信息的一个请求,并且由私钥签名。CSR递交给CA(证书签发机构)后,CA会核验签名和身份信息,然后根据公钥和CSR中的证书信息生成证书。其中,证书的Subject就是证书的标识,其就像一个人的名字,由国家(C)、省份(S)、城市(L)、单位(O)、单位单元(OU)、公用名(CN)组成。其中CN很重要,一般都包括CN。当然,还支持其他信息,使用Object Identity命名(也就是你不能直接创建一个叫Address的字段,而是要根据这个Address字段申请一个Object Identity,然后使用这个Object Identity作为字段)。

读一个证书

我们使用openssl读取一个证书,以我的举例:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            35:d6:74:0a:c5:1e:3b:67:3d:c7:b3:92
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = BE, O = GlobalSign nv-sa, CN = AlphaSSL CA - SHA256 - G4
        Validity
            Not Before: Jan  3 06:01:51 2024 GMT
            Not After : Feb  3 06:01:50 2025 GMT
        Subject: CN = *.wuntsong.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c3:b5:1f:78:85:73:d1:55:62:ee:86:87:02:88:
                    3b:65:79:ba:b5:cb:79:fe:1b:44:29:7e:f0:8c:8e:
                    ff:10:5f:96:71:93:b3:a8:14:98:71:13:f2:e7:71:
                    ba:13:c5:02:a8:bb:81:27:bf:50:3f:5b:f9:bd:93:
                    ae:da:ed:cd:05:e3:28:32:3e:7c:c2:11:76:ff:c6:
                    b2:4c:1b:5b:31:31:63:f4:b6:0c:39:2e:90:ca:16:
                    b3:58:3a:e8:95:1b:c9:c6:23:db:28:07:63:1a:11:
                    b9:5e:8c:e1:90:32:55:eb:50:fc:49:41:dc:a0:e2:
                    af:ab:b0:ae:e6:a1:70:aa:78:8f:8e:b7:8b:92:87:
                    89:62:3f:e0:b7:fc:e8:45:6a:5e:cd:95:04:ca:b9:
                    9f:bf:05:26:8d:1a:c1:6f:22:41:43:b0:06:73:79:
                    79:81:f8:64:55:62:5b:e5:52:47:84:85:30:4c:a2:
                    a9:29:96:47:02:8f:18:95:e0:dc:91:14:f4:9f:e9:
                    2b:8a:16:f6:0a:4f:9c:ce:4f:24:30:e4:a5:53:a3:
                    86:7a:64:76:66:91:49:09:78:54:93:de:3a:7e:64:
                    15:aa:d9:ef:29:09:a3:91:66:80:54:76:45:c8:03:
                    36:23:3d:c4:40:d5:40:da:b2:d0:92:4b:d2:c9:e2:
                    aa:1d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Basic Constraints: critical
                CA:FALSE
            Authority Information Access:
                CA Issuers - URI:http://secure.globalsign.com/cacert/alphasslcasha256g4.crt
                OCSP - URI:http://ocsp.globalsign.com/alphasslcasha256g4
            X509v3 Certificate Policies:
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.4146.10.1.3
                  CPS: https://www.globalsign.com/repository/
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://crl.globalsign.com/alphasslcasha256g4.crl
            X509v3 Subject Alternative Name:
                DNS:*.wuntsong.com, DNS:wuntsong.com
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Authority Key Identifier:
                4F:CB:AC:A8:C2:EF:AB:DD:83:6F:6B:BF:CE:98:3D:5C:58:25:76:15
            X509v3 Subject Key Identifier:
                AA:49:A7:C4:DE:BF:55:01:35:89:E5:AC:D9:A0:4C:6D:A5:84:CC:2B
            CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : A2:E3:0A:E4:45:EF:BD:AD:9B:7E:38:ED:47:67:77:53:
                                D7:82:5B:84:94:D7:2B:5E:1B:2C:C4:B9:50:A4:47:E7
                    Timestamp : Jan  3 06:01:54.136 2024 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:A4:A1:98:DF:79:ED:20:CF:21:31:46:
                                6F:41:AF:84:42:47:37:81:05:E5:4F:D0:DB:47:4A:07:
                                2F:A5:00:D8:DC:02:20:2D:3F:BA:9A:1F:CD:C2:FD:E6:
                                31:CB:C5:BD:9E:80:A6:17:70:58:1D:E7:61:CD:80:31:
                                0E:66:8C:17:3D:91:57
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 4E:75:A3:27:5C:9A:10:C3:38:5B:6C:D4:DF:3F:52:EB:
                                1D:F0:E0:8E:1B:8D:69:C0:B1:FA:64:B1:62:9A:39:DF
                    Timestamp : Jan  3 06:01:54.425 2024 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:20:36:E2:14:3A:23:24:FD:4D:46:28:24:3A:
                                64:C9:84:A4:39:17:C2:90:26:CB:49:40:AD:86:F5:5D:
                                FF:13:FB:10:02:21:00:90:B8:80:0C:80:7E:0F:C1:29:
                                CD:97:E7:09:C2:6E:1D:14:3D:08:AD:C6:6E:A1:94:96:
                                CF:4C:08:BE:7A:DB:AA
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : E0:92:B3:FC:0C:1D:C8:E7:68:36:1F:DE:61:B9:96:4D:
                                0A:52:78:19:8A:72:D6:72:C4:B0:4D:A5:6D:6F:54:04
                    Timestamp : Jan  3 06:01:54.358 2024 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:E0:24:AA:F6:B3:41:FC:AB:A8:95:F9:
                                37:82:08:6A:56:91:29:1F:3C:CD:73:24:08:28:01:A3:
                                70:AA:BA:E2:3C:02:20:3D:56:59:47:06:BB:8B:73:D3:
                                36:CC:77:4A:A5:9E:B0:97:99:C1:DB:A9:EB:93:2D:8C:
                                66:F2:72:85:77:FF:F0
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        0b:c0:fe:a2:26:0e:10:35:21:91:2f:67:a5:20:aa:6c:ed:0a:
        9d:1c:70:2d:92:78:32:ba:9f:be:b3:b5:89:2b:09:ac:55:eb:
        c7:96:8f:99:39:08:c8:94:2a:71:74:25:89:7f:56:98:43:a3:
        e9:67:e8:73:c2:9e:1a:34:50:47:8b:66:17:3d:47:16:e2:d6:
        bb:81:cd:3e:a7:47:d1:0a:ed:95:2d:9f:be:f8:4d:79:7b:b2:
        8a:c6:4b:14:3f:cc:52:e0:1b:ab:c6:18:a7:70:64:ca:b6:b9:
        29:bf:67:09:0e:f5:4a:0a:aa:17:c0:c7:51:29:a4:40:e2:97:
        aa:fb:ea:a0:0e:53:5b:2a:f1:70:07:55:77:cb:23:b1:3b:04:
        c8:e4:e7:f9:dd:72:d0:13:d1:6b:fc:f5:21:f6:38:cd:7f:76:
        ed:d3:0b:00:dd:4b:fb:a8:81:57:5f:23:69:71:6d:3b:65:19:
        65:e4:ae:71:3e:9c:05:fe:7a:61:8b:8b:2a:00:72:71:8d:bb:
        2d:0d:83:0b:05:dd:f6:08:ae:10:44:48:65:a8:2c:fe:e7:b9:
        08:5f:85:67:61:04:22:52:f5:70:bd:06:37:e2:8d:1f:9e:41:
        87:6a:02:23:a5:3d:11:5c:d0:ca:02:72:e4:11:36:d6:bf:10:
        f2:58:75:76

我们可以看到:Issuer是我们的签发人。Subject是我们。自签证书的Issuer和Subject则为同一个人。

我们可以看到"X509v3 extensions",字面意思是扩展,实际上就是证书的参数。例如:"Key Usage"标识用途,这里是身份认证和数字签名。因为"Key Usage"不够用,又推出了"Extended Key Usage"。同理,extensions也是可以根据Object Identity自定义的。

证书链

从签发的应用证书,到上级CA证书,一直追溯到根CA证书(自签证书)形成的一条链,就叫做证书链。证书链越长,信任程度理论上越低。信任了根CA或中间CA,往下追溯的应用证书一般就可以被信任了。现代电脑一般内置了大厂的根证书,所以我们一般只需要提供应用证书及其中间CA证书,就可以让电脑(浏览器)信任我们。有时候电脑甚至直接内置了中间CA证书,那么就只需要提供应用证书即可。

在实际配置Https的时候,往往需要提供证书链,这就是避免中间证书没内置在用户电脑,导致证书链不完整,我们的证书不能被信任的问题。但是提供证书链往往不需要包含根证书,因为根证书内置在用户电脑,如果不内置在用户电脑,提供了也没用(因为根证书是自签证书,浏览器不信任你提供的,只信任系统内置的)。

使用Go创建证书

我们完全可以使用Golang语言创建私钥、公钥、CSR、根CA证书、中间CA证书、应用证书。并定制我们的Object Identity。

X.509体系

X.509是一种标准,用于定义公共密钥证书的格式。它建立了在网络通信中进行身份验证和安全传输所需的基础。X.509证书包含了一个实体(如个人、组织或设备)的公钥和相关身份信息,并由可信任的第三方证书颁发机构(CA)签发和管理。这些证书被广泛用于SSL/TLS协议,用于安全地建立网络连接,保护数据的机密性和完整性。