1.簡介
官方文檔
| SSL | https://www.ssl.com/faqs/faq-what-is-ssl/ |
| TLS | |
| X.509 | |
| HTTPS |
SSL(Secure Sockets Layer 安全套接字層協議),是用於在聯網計算機之間建立可靠鏈接的一種協議,這個可靠指的是 [ 經過身份驗證 和 加密 ]。ssl這個名字棄用於1999年。
TLS(Transport Layer Security 傳輸層安全協議),於1999年發布,接替原SSL並改名為TLS,是一種認證和加密協議。 TLS 1.3在中定義 RFC 8446 .
HTTPS = HTTP : 443 + TLS

2.信息安全問題
- 傳輸[雙]方身份的可靠性 -- 使用數字證書解決
- 信息的保密性 -- 使用加密算法:對稱aes,des等; 非對稱:rsa
- 信息的完整性 -- 散列算法(sha1、MD5等)生成摘要1與內容一起加密,另一方解密后得到摘要1和內容,使用相同散列算法對內容生成摘要2,對比摘要1與摘要2
3.CA、數字證書
3.1 驗證過程
簡單情況下,服務端持有私鑰,然后把公鑰發給客戶端,后者使用公鑰就可以完成加密工作。
但是,傳輸過程中數據可能被第3方劫持、冒充,在中間互相扮演對方。
權威的認證機構(CA)可以解決這個問題。它用驗證對方數字證書的可靠性。過程大致如下:
- 服務端去權威機構申請證書,填寫持有人、服務器地址等信息。
- CA使用自己的私鑰對服務器信息加密生成數字證書,包含(證書內容,散列算法,加密密文,服務端的公鑰)。
- 服務端得到數字證書后布置
- 客戶端預先把可靠的CA公鑰列表存到本地。
- 客戶端發請求,得到服務端數字證書后,用CA公鑰驗證證書合法性
- 合法后,會從證書里得到服務端公鑰。
- 加密傳輸
3.2 X.509 證書結構
X.509 是一種公鑰證書 格式標准,是將加密密鑰對與網站、個人或組織等身份安全地關聯的數字文檔。見 RFC 5280 ,它的編碼格式主要有兩種:
- .DER 是二進制編碼,可包含所有私鑰、公鑰和證書,是大多數瀏覽器的缺省格式,常見於 Windows 系統中的證書格式。
- .PEM 是文本格式的, 以 “
-----BEGIN CERTIFICATE-----開頭,已-----END CERTIFICATE-----結尾”, 中間是經過 base64 編碼的內容, Apache 和 NGINX 服務器偏向於使用這種編碼格式,也是 openssl 默認采用的信息存放方式。PEM 其實就是把 DER 的內容進行了一次 base64 編碼。
3.3 查看其它證書
執行命令:
openssl s_client -connect qq.com:443 | openssl x509 -text
結果如下
admin@jfie82o:~$ openssl s_client -connect qq.com:443 | openssl x509 -text
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
verify return:1
depth=0 C = CN, ST = \E5\B9\BF\E4\B8\9C\E7\9C\81, L = \E6\B7\B1\E5\9C\B3\E5\B8\82, O = Shenzhen Tencent Computer Systems Company Limited, CN = qq.com
verify return:1
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
05:62:4d:f7:ef:6b:f9:d4:dd:21:ef:c1:69:19:5e:5d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
Validity
Not Before: Jul 26 00:00:00 2021 GMT
Not After : Jul 26 23:59:59 2022 GMT
Subject: C = CN, ST = \E5\B9\BF\E4\B8\9C\E7\9C\81, L = \E6\B7\B1\E5\9C\B3\E5\B8\82, O = Shenzhen Tencent Computer Systems Company Limited, CN = qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:e3:59:82:18:14:b3:4f:55:ec:1e:d5:bd:b1:3c:
14:78:f3:53:8c:b4:a2:c3:79:dc:1e:70:46:c8:6c:
44:a2:a8:6b:81:fc:1a:73:3c:91:b5:1b:b2:b9:17:
67:64:d4:6f:81:18:20:e6:a9:7c:f5:e3:49:22:ac:
......
3.4 申請數字證書
ssl https://www.ssl.com/certificates/basicssl/

沃通
4.自簽名證書
在測試、內部、私密等場景下,需要創建自簽名證書。
資料:
4.1 生成服務器私鑰
openssl genrsa -out private.key 4096
在目錄下會生下 private.key
4.2 生成證書請求文件(CSR)
openssl req -new -key private.key -out test.csr
注意 Common Name 應輸入 域名(如video.test.com),最后在目錄下生成test.csr

4.3 簽發證書
使用前面生成的兩個文件執行下面命令。
openssl x509 -req -days 365 -in test.csr -signkey private.key -out test.crt
生成test.crt

5.自建 CA 簽發服務器證書
創建自簽 CA 證書,主要分為兩個部分:
- 創建CA 根證書
- 簽發客戶端證書。
5.1 創建CA根證書
第1步:創建 CA 目錄並初始化
mkdir -p ~/ssl/myca/{certs,newcerts,crl,private}
cd ~/ssl/myca
touch index.txt
echo "01" > serial
第2步:配置openssl.cnf 文件
把 CA 的配置文件(/etc/ssl/openssl.cnf) 拷貝到當前目錄,可以對其中的參數進行修改,如:

第3步:生成根證書
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -config openssl.cnf -days 365
注意Common Name 應輸入 域名,如“audio.test.com”。結果如下:
- 生成的 cacert.crt 是根證書
- 生成的cakey.key 是證書的公鑰
- 使用cat命令可把crt與key 合並成cer文件
cat cacert.crt cakey.key > cacert.cer
5.2 簽發證書
第1步:生成 4096 bit 的客戶端私鑰
openssl genrsa -out client.key 4096
第2步:用該客戶端私鑰生成證書簽名請求文件
openssl req -new -key client.key -out client.csr -config openssl.cnf
第3步:使用 CA 根證書簽發客戶端證書
openssl ca -in client.csr -out client.crt -cert cacert.crt -keyfile cakey.key -config openssl.cnf
在當前目錄下生成了client.crt證書

5.3 證書轉換及查看
合並crt與key 成cer文件:
cat cacert.crt cakey.key > cacert.cer
把cacert.crt 轉為 DER:
openssl x509 -in cacert.crt -outform der -out cacert.der
把cacert.crt 轉為 PEM:
openssl x509 -in cacert.crt -outform pem -out cacert.pem
DER 轉為 PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cacert.pem
轉成p12 :
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -export -clcerts -in client2.crt -inkey client2.key -out client2.p12
查看公鑰:
openssl rsa -noout -text -in cakey.key
查看證書:
openssl x509 -noout -text -in cacert.crt
6.HTTPS 驗證過程
6.1 https 單向認證過程
其中第3步驗證的主要內容如下
- 證書是否過期;
- 發行服務器證書的CA是否可靠;(通過查詢瀏覽器或本機內的CA證書)
- 返回的公鑰是否能正確解開返回證書中的數字簽名;
- 服務器證書上的域名是否和服務器的實際域名相匹配;
6.2 https 雙向認證過程

注意事項 :
- 生成根公鑰證書和私鑰文件(root.crt/root.key)
- 使用根證書和根證書私鑰(root.crt/root.key)配合服務器端私鑰頒發服務器端證書(server.crt);
- 使用根證書和根證書私鑰(root.crt/root.key)配合客戶端私鑰頒發客戶端證書(server.crt);
- 將根證書(root.crt)、服務器端證書(server.crt)、服務器端秘鑰(server.key)配置到Server中;
- 客戶端使用客戶端私鑰和根證書頒發的客戶端證書(client.crt)正常訪問業務。
