1.2. 什么是 SSL 以及什么是证书?

安全套接层协议 (SSL) 由 Netscape 创建,旨在确保 Web 服务器和浏览器之间的安全交易。该协议使用第三方,即证书颁发机构 (CA),来识别交易的一端或两端。简而言之,这就是它的工作原理。

  1. 浏览器请求安全页面(通常是 https://)。

  2. Web 服务器发送其公钥及其证书。

  3. 浏览器检查证书是否由受信任方(通常是受信任的根 CA)颁发,证书是否仍然有效,以及证书是否与所联系的站点相关。

  4. 然后,浏览器使用公钥加密一个随机对称加密密钥,并将其与加密的 URL 以及其他加密的 http 数据一起发送到服务器。

  5. Web 服务器使用其私钥解密对称加密密钥,并使用对称密钥解密 URL 和 http 数据。

  6. Web 服务器发回使用对称密钥加密的请求 html 文档和 http 数据。

  7. 浏览器使用对称密钥解密 http 数据和 html 文档,并显示信息。

这里有几个概念需要理解。

1.2.1. 私钥/公钥

使用私钥/公钥对进行加密可确保数据可以由一个密钥加密,但只能由另一个密钥对解密。这有时很难理解,但请相信它有效。密钥本质上是相似的,可以交替使用:一个密钥加密的内容,另一个密钥对可以解密。密钥对基于素数,它们的位长度确保了在没有密钥对的情况下难以解密消息。密钥对的诀窍是保密一个密钥(私钥),并将另一个密钥(公钥)分发给所有人。任何人都可以向您发送加密消息,只有您才能解密。只有您拥有另一个密钥对,对吗?相反,您可以证明消息仅来自您,因为您已使用私钥对其进行了加密,并且只有关联的公钥才能正确解密它。请注意,在这种情况下,消息是不安全的,您只是对其进行了签名。记住,每个人都有公钥!

剩下的问题之一是如何知道您的通信对象的公钥。通常,您会要求他向您发送一条非机密的签名消息,其中将包含他的公钥以及证书。

Message-->[Public Key]-->Encrypted Message-->[Private Key]-->Message

1.2.2. 证书

您如何知道您正在与正确的人或正确的网站打交道?嗯,有人(如果他们是认真的)花费了大量精力来确保网站所有者是他们声称的那样。这个人,您必须 implicitly 信任:您的浏览器中已加载了他/她的证书(根证书)。证书包含有关证书所有者的信息,例如电子邮件地址、所有者姓名、证书用途、有效期、资源位置或 distinguished name (DN),其中包括通用名称 (CN)(网站地址或电子邮件地址,取决于用途)以及证明(签名)此信息的人的证书 ID。它还包含公钥,最后包含哈希值,以确保证书未被篡改。由于您选择信任签署此证书的人,因此您也信任此证书。这是一个证书信任树或证书路径。通常,您的浏览器或应用程序已经加载了知名证书颁发机构 (CA) 或根 CA 证书的根证书。CA 维护所有已签名证书的列表以及已吊销证书的列表。证书在签名之前是不安全的,因为只有签名的证书才能被修改。您可以使用证书本身对证书进行签名,这称为自签名证书。所有根 CA 证书都是自签名的。

Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 1 (0x1) 
        Signature Algorithm: md5WithRSAEncryption 
        Issuer: C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root CA/Email=administrator@sopac.org 
        Validity 
            Not Before: Nov 20 05:47:44 2001 GMT 
            Not After : Nov 20 05:47:44 2002 GMT 
        Subject: C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=www.sopac.org/Email=administrator@sopac.org 
        Subject Public Key Info: 
            Public Key Algorithm: rsaEncryption  
            RSA Public Key: (1024 bit) 
                Modulus (1024 bit): 
                    00:ba:54:2c:ab:88:74:aa:6b:35:a5:a9:c1:d0:5a: 
                    9b:fb:6b:b5:71:bc:ef:d3:ab:15:cc:5b:75:73:36: 
                    b8:01:d1:59:3f:c1:88:c0:33:91:04:f1:bf:1a:b4: 
                    7a:c8:39:c2:89:1f:87:0f:91:19:81:09:46:0c:86: 
                    08:d8:75:c4:6f:5a:98:4a:f9:f8:f7:38:24:fc:bd: 
                    94:24:37:ab:f1:1c:d8:91:ee:fb:1b:9f:88:ba:25: 
                    da:f6:21:7f:04:32:35:17:3d:36:1c:fb:b7:32:9e: 
                    42:af:77:b6:25:1c:59:69:af:be:00:a1:f8:b0:1a: 
                    6c:14:e2:ae:62:e7:6b:30:e9 
                Exponent: 65537 (0x10001) 
         X509v3 extensions: 
             X509v3 Basic Constraints: 
                 CA:FALSE 
             Netscape Comment: 
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier:
                 FE:04:46:ED:A0:15:BE:C1:4B:59:03:F8:2D:0D:ED:2A:E0:ED:F9:2F 
             X509v3 Authority Key Identifier:
                 keyid:E6:12:7C:3D:A1:02:E5:BA:1F:DA:9E:37:BE:E3:45:3E:9B:AE:E5:A6 
                 DirName:/C=FJ/ST=Fiji/L=Suva/O=SOPAC/OU=ICT/CN=SOPAC Root CA/Email=administrator@sopac.org 
                 serial:00
    Signature Algorithm: md5WithRSAEncryption
        34:8d:fb:65:0b:85:5b:e2:44:09:f0:55:31:3b:29:2b:f4:fd: 
        aa:5f:db:b8:11:1a:c6:ab:33:67:59:c1:04:de:34:df:08:57: 
        2e:c6:60:dc:f7:d4:e2:f1:73:97:57:23:50:02:63:fc:78:96: 
        34:b3:ca:c4:1b:c5:4c:c8:16:69:bb:9c:4a:7e:00:19:48:62: 
        e2:51:ab:3a:fa:fd:88:cd:e0:9d:ef:67:50:da:fe:4b:13:c5: 
        0c:8c:fc:ad:6e:b5:ee:40:e3:fd:34:10:9f:ad:34:bd:db:06: 
        ed:09:3d:f2:a6:81:22:63:16:dc:ae:33:0c:70:fd:0a:6c:af:
        bc:5a 
-----BEGIN CERTIFICATE----- 
MIIDoTCCAwqgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBiTELMAkGA1UEBhMCRkox 
DTALBgNVBAgTBEZpamkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQww 
CgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0B 
CQEWF2FkbWluaXN0cmF0b3JAc29wYWMub3JnMB4XDTAxMTEyMDA1NDc0NFoXDTAy 
MTEyMDA1NDc0NFowgYkxCzAJBgNVBAYTAkZKMQ0wCwYDVQQIEwRGaWppMQ0wCwYD 
VQQHEwRTdXZhMQ4wDAYDVQQKEwVTT1BBQzEMMAoGA1UECxMDSUNUMRYwFAYDVQQD 
Ew13d3cuc29wYWMub3JnMSYwJAYJKoZIhvcNAQkBFhdhZG1pbmlzdHJhdG9yQHNv 
cGFjLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAulQsq4h0qms1panB 
0Fqb+2u1cbzv06sVzFt1cza4AdFZP8GIwDORBPG/GrR6yDnCiR+HD5EZgQlGDIYI 
2HXEb1qYSvn49zgk/L2UJDer8RzYke77G5+IuiXa9iF/BDI1Fz02HPu3Mp5Cr3e2 
JRxZaa++AKH4sBpsFOKuYudrMOkCAwEAAaOCARUwggERMAkGA1UdEwQCMAAwLAYJ 
YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud
DgQWBBT+BEbtoBW+wUtZA/gtDe0q4O35LzCBtgYDVR0jBIGuMIGrgBTmEnw9oQLl 
uh/anje+40U+m67lpqGBj6SBjDCBiTELMAkGA1UEBhMCRkoxDTALBgNVBAgTBEZp 
amkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQwwCgYDVQQLEwNJQ1Qx 
FjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0BCQEWF2FkbWluaXN0 
cmF0b3JAc29wYWMub3JnggEAMA0GCSqGSIb3DQEBBAUAA4GBADSN+2ULhVviRAnw 
VTE7KSv0/apf27gRGsarM2dZwQTeNN8IVy7GYNz31OLxc5dXI1ACY/x4ljSzysQb 
xUzIFmm7nEp+ABlIYuJRqzr6/YjN4J3vZ1Da/ksTxQyM/K1ute5A4/00EJ+tNL3b 
Bu0JPfKmgSJjFtyuMwxw/Qpsr7xa
-----END CERTIFICATE-----

正如您可能已经注意到的,证书包含对颁发者的引用、此证书所有者的公钥、此证书的有效期以及证书的签名,以确保此证书未被篡改。证书不包含私钥,因为它绝不应以任何形式传输。此证书具有向所有者发送加密消息(使用公钥)或验证由该证书作者签名的消息的所有要素。

1.2.3. 对称密钥

好吧,私钥/公钥加密算法很棒,但它们通常不实用。它是非对称的,因为您需要另一个密钥对才能解密。您不能使用相同的密钥进行加密和解密。使用相同密钥进行解密和加密的算法被认为是具有对称密钥。对称算法比非对称算法在完成其工作时要快得多。但是对称密钥可能非常不安全。如果敌人掌握了密钥,那么您将不再有秘密信息。因此,您必须将密钥传输给另一方,而不能让敌人掌握它。如您所知,互联网上没有任何东西是安全的。解决方案是将对称密钥封装在用非对称算法加密的消息中。您从未将您的私钥传输给任何人,那么用公钥加密的消息是安全的(相对安全,除了死亡和税收,没有什么可以确定的)。对称密钥也是随机选择的,因此,如果对称密钥被发现,则下一次交易将完全不同。

Symetric Key-->[Public Key]-->Encrypted Symetric Key-->[Private Key]-->Symetric Key

1.2.4. 加密算法

有几种可用的加密算法,使用对称或非对称方法,密钥长度各不相同。通常,算法不能申请专利,如果亨利·庞加莱为他的算法申请了专利,那么他就可以起诉阿尔伯特·爱因斯坦了……因此,算法不能申请专利,美国除外。OpenSSL 是在一个算法不能申请专利且加密技术不限于军事和情报机构等国家机构的国家开发的。在浏览器和 Web 服务器之间的协商过程中,应用程序将相互指示一个可理解的算法列表,并按偏好顺序排列。然后选择常见的首选算法。OpenSSL 可以在有或没有某些算法的情况下编译,因此可以在许多适用限制的国家/地区使用。

1.2.5. 哈希

哈希是由消息的哈希函数给出的数字。这是一个单向函数,这意味着知道哈希值不可能获得原始消息。但是,即使消息发生最细微的修改,哈希值也会发生巨大变化。因此,在保持原始哈希值的同时修改消息非常困难。它也称为消息摘要。哈希函数用于密码机制、证明应用程序是原始的(MD5 校验和),以及通常用于确保任何消息都未被篡改。互联网工程任务组 (IETF) 出于许多技术原因(参见 RFC2459 7.1.2 和 7.1.3)似乎更喜欢 SHA1 而不是 MD5。

1.2.6. 签名

签署消息意味着验证您自己已确保消息的真实性(大多数情况下,这意味着您是作者,但不一定)。消息可以是文本消息,也可以是他人的证书。要签署消息,您需要创建其哈希值,然后使用您的私钥加密哈希值,然后将加密的哈希值和您的签名证书添加到消息中。接收者将重新创建消息哈希值,使用存储在您的签名证书中的众所周知的公钥解密加密的哈希值,检查两个哈希值是否相等,最后检查证书。

签署消息的另一个优点是,您可以自动将您的公钥和证书传输给所有接收者。

通常有两种签名方式,将文本消息封装在签名内(带分隔符),或者将消息与签名一起编码。后一种形式是一种非常简单的加密形式,因为任何软件都可以解密它(如果它可以读取嵌入的公钥)。第一种形式的优点是消息是人类可读的,允许任何不兼容的客户端按原样传递消息以供用户阅读,而第二种形式甚至不允许读取消息的任何部分(如果消息已被篡改)。

1.2.7. 密码短语

“密码短语就像密码,只是它更长”。在早期,Unix 系统上的密码限制为 8 个字符,因此对于较长的密码使用术语密码短语。密码越长,就越难猜测。如今,Unix 系统使用 MD5 哈希,对密码长度没有限制。

1.2.8. 公钥基础设施

公钥基础设施 (PKI) 是软件管理系统和数据库系统,允许签名证书、保留吊销证书列表、分发公钥等。您通常可以通过网站和/或 ldap 服务器访问它。也会有人检查您是否是您... 为了保护单个应用程序,您可以使用任何知名的商业 PKI,因为它们的根 CA 证书很可能位于您的浏览器/应用程序中。问题是保护电子邮件,您可以为您的电子邮件获得通用类型的证书,或者您必须为每个证书/电子邮件地址每年支付约 100 美元。如果您从未收到过包含他的证书(包括他的公钥)的先前电子邮件,也无法找到某人的公钥。