HTTPS安全通訊 3. 證書概念與使用
- 一、建構HTTPS網站
- 1. 獲驗證書和密鑰對
- 1.1.1 自簽名證書
- 第1步 生成私鑰對和CSR
- 第2步 生成自簽名證書
- 1.1.2 向CA機構申請證書
- 1.1.3 使用Let's Encrypt證書
- 2. 部署證書和密鑰對
- 1.2.1 Nginx 下部署
- 1.2.2 Apache
- 3. 測試https
- 1.3.1 使用curl
- 1.3.2 使用Chrome開發者工具
- 1.3.3 301重定向
- 1.3.4 HSTS
- 1.3.5 CSP
- 4. OpenSSL的線上工具
- 1.4.1 生成CSR
- 1.4.2 CSR 分析
- 二、PKI
- X.509
- 三、證書
- 1. ASN.1
- 2. 證書結構
- 3.2.1 證書的主要結構:
- 3.2.2. `TBSCertificate`結構:
- 3.2.3 簽名算法
- 3.2.4 issuer 示例
- 3.2.5 validity
- 3. CSR
- 3.3.1 CSR也采用ASN.1标準描述,整體格式是:
- 3.3.2 CertificationRequestInfo結構:
- 3.3.3 CSR生成過程
- 3.3.4 證書擴充
- 3.3.5 證書分類
- 根據驗證模式分類
- 根據域名分類
- 四、 證書鍊
- 1. 證書類型
- (1) 在Chrome中看CSDN的證書:
- (2) 使用openssl指令檢視網站證書情況
- 2. 信任鍊校驗
- 3. 根證書
- Linux各個發行版中,OpenSSL庫會內建根證書
- windows
- Mozilla
- 五、CRL 證書吊銷清單
- 六、OCSP
- 七、證書格式
- 1. DER
- 2. BER
- 3. CER
- 4. PEM
- 5. 編碼轉換
- 6. 其它的證書格式
- 7.6.1 PKCS#12(字尾.pkcs12 .pfx .p12)
- 7.6.2 PKCS#7
- 7.6.3 JKS
- 7.6.4 BKS
- 7. CSR管理
- 7.7.1 檢視CSR
- 7.7.2 校驗CSR簽名
- 八、導入根證書
一、建構HTTPS網站
1. 獲驗證書和密鑰對
1.1.1 自簽名證書
當浏覽器發現證書是自簽名的,會提示使用者是否信任該證書。一般企業内部應用可以選擇自簽名證書。
第1步 生成私鑰對和CSR
CSR用來請求證書,其中包含了伺服器的密鑰對,CA機構收到請求後會驗證CSR請求的簽名。
openssl req -newkey rsa:1024 -nodes -keyout my_key.pem -out mykey_csr.pem
提示輸入中最重要的是輸入域名資訊:Common Name。
第2步 生成自簽名證書
就是模拟CA機構對盲目簽名:
openssl x509 -signkey my_key.pem -in mykey_csr.pem -req -days 365 -out my_cert.pem
生成
my_cert.pem
即簽名後的證書:
1.1.2 向CA機構申請證書
- 向專門的CA機構申請;
- 向代理機構申請,如一些雲廠商。
證書申請的方式:
- 向CA發送CSR;
- CA統一生成證書和密鑰對,但洩露了自己的私鑰。
申請時,CA機構通過DNS TXT記錄或伺服器上一個特殊的txt檔案來校驗域名所有者。
1.1.3 使用Let’s Encrypt證書
Let’s Encrypt可以申請免費的證書,作為一個CA機構得到了很多大公司的支援,它定義了ACME協定,将管理證書的流程進行了标準化。
可以使用基于ACME協定的用戶端在Let’s Encrypt管理證書,官方推薦Certbot用戶端。
# 下載下傳Certbot用戶端
git clone https://github.com/certbot/certbot
cd certbot
# 生成證書,-w表示代碼根目錄,-d要申請證書的域名,--webroot表示安裝插件。
./certbot-auto certonly --webroot -w /usr/nginx/web -d www.mydomain.com
運作結束在/etc/letsencrypt/live/www.mydomain.com下生成4個檔案,最重要的是:
- fullchain.pem 完整證書鍊
-
privkey.pem 私鑰
另外還有:
- cert.pem
- chain.pem
webroot
插件用來校驗申請者身份,該指令需要在mydomain主機上運作,主機web在
/usr/nginx/web
下。
2. 部署證書和密鑰對
1.2.1 Nginx 下部署
http{
#http節點中可以添加多個server節點
server{
#監聽443端口
listen 443;
#對應的域名,把mydomain.com改成自己的域名
server_name mydomain.com;
ssl on;
# 證書路徑
ssl_certificate /etc/cert/fullchain.pem;
# 密鑰對路徑
ssl_certificate_key /etc/cert/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#檔案夾
root /usr/local/service/ROOT;
#首頁檔案
index index.html;
}
}
server{
listen 80;
server_name mydomain.com;
rewrite ^/(.*)$ https://mydomain.com:443/$1 permanent;
}
}
1.2.2 Apache
vim /etc/apache2/sites-available/default-ssl.conf
<VirtualHost _default_:443>
DocumentRoot /var/www/html
ServerName www.mydomain.com
# 開啟SSL
SSLEngine on
SSLCertificateFile /etc/cert/fullchain.pem;
SSLCertificateKeyFile /etc/cert/privkey.pem
</VirtualHost>
3. 測試https
1.3.1 使用curl
curl "" --verbose | head
1.3.2 使用Chrome開發者工具
1.3.3 301重定向
在遷移老的網站,為了讓http頁面能通路到,可以設定301重定向,将http轉向https。
POST請求不支援301重定向。
1.3.4 HSTS
一種新的Web安全協定HTTP Strict Transport Security(HSTS),在server的http的head裡加:
Strict-Transport-Security: max-age=31536000; includeSubDomains
在接下來的31536000秒内,浏覽器向域名和子域名的http請求強制轉成https。
當發現自簽名證書時,浏覽器會強上停止通路,不會出現讓使用者選擇信任或不信任的彈出視窗。
1.3.5 CSP
CSP指的是内容安全政策,為了緩解很大一部分潛在的跨站腳本問題,浏覽器的擴充程式系統引入了内容安全政策(CSP)的一般概念。
CSP主要以白名單機制對網站加載或執行的資源起作用。
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
4. OpenSSL的線上工具
myssl.cn是DigiCert官方授權的中國區合作夥伴,線上提供了一些ssl工具,下面提供兩個示例:
1.4.1 生成CSR
https://www.myssl.cn/tools/create-csr.html
1.4.2 CSR 分析
二、PKI
Public Key Infrastructure(PKI),中文公鑰基礎設施,由一系列實體組成的集合體,用于向用戶端提供可信的伺服器身份認證。
X.509
PKI的标準規定PKI的設計、實施和營運,PKI事實上的标準是X.509。
X.509來自于國際電信聯盟電信标準(ITU-T)的X.500标準,發展主要曆史:
- X.209 1988
- X.500 1993,ISO組織接受的目錄服務系統标準,定義了一個機構如何在全局範圍内共享其名字和與之相關的對象。X.500是分層次的,其中的管理域(機構、分支、部門和工作組)可以提供這些域内的使用者和資源資訊。在PKI體系中,X.500被用來惟一辨別一個實體,該實體可以是機構、組織、個人或一台伺服器。X.500被認為是實作目錄服務的最佳途徑,但X.500的實作需要較大的投資,并且比其他方式速度慢;而其優勢具有資訊模型、多功能和開放性。
- X.509 1993 由國際電信聯盟(ITU-T)制定的數字證書标準,最初版本公布于1988年。X.509證書由使用者公共密鑰和使用者辨別符組成。此外還包括版本号、證書序列号、CA辨別符、簽名算法辨別、簽發者名稱、證書有效期等資訊。這一标準的最新版本是X.509 v3。
三、證書
對HTTPS通訊來說,核心是了解證書。
證書主要包括:簽名、伺服器實體資訊、CA機構資訊。
1. ASN.1
ASN.1是資料結構描述語言,由ITU-T定義的标準,用來結構化描述證書。它有兩部分:
- ISO 8824/ITU X.208 描述資訊内的資料、資料類型及序列格式,也就是資料的文法;
-
ISO 8825/ITU X.209 描述如何将各部分資料組成消息,也就是資料的基本編碼規則。
X.509定義了證書應該包含的内容,而ASN.1是具體的資料結構。
ASN.1 原來是X.409的一部分,後來獨立出來成為一個标準 ,廣泛應用于計算機通訊領域。
2. 證書結構
3.2.1 證書的主要結構:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier, # 簽名算法
signature BIT STRING # 簽名值
}
SEQUENCE
是
ASN.1
中的一個結構體,包括多個屬性。屬性還可以嵌套其它的
ASN.1
結構。
TBSCertificate
就是一個
SEQUENCE
結構。
3.2.2. TBSCertificate
結構:
TBSCertificate
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, -- 證書版本号
serialNumber CertificateSerialNumber, -- 證書序列号,對同一CA所頒發的證書,序列号唯一辨別證書
signature AlgorithmIdentifier, --證書簽名算法辨別
issuer Name, --證書發行者名稱,簡稱DN
validity Validity, --證書有效期
subject Name, --證書主體名稱
subjectPublicKeyInfo SubjectPublicKeyInfo,--證書公鑰
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書發行者ID(可選),隻在證書版本2、3中才有
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書主體ID(可選),隻在證書版本2、3中才有
extensions [3] EXPLICIT Extensions OPTIONAL -- 證書擴充段(可選),隻在證書版本3中才有
}
3.2.3 簽名算法
簽名算法辨別符
AlgorithmIdentifier
類型也是一個
SEQUENCE
結構,由兩個屬性構成:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
3.2.4 issuer 示例
Let’s Encrypt:
C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
3.2.5 validity
有效期,結構:
Validity ::= SEQUENCE{
notBefore Time,
notAfter Time
}
3. CSR
伺服器實體為了證明自己的身份,要向CA機構申請證書。在申請之前,先生成一個CSR(Certificate Signing Request)檔案,即證書簽名請求檔案,把這個CSR檔案發給CA機構。
CA機構使用其根證書私鑰簽名就生成了證書公鑰檔案,也就是頒發給使用者的證書。
CSR檔案包括兩部分:
- 生成證書必須的資訊,如域名、公鑰
- 伺服器實體的證明材料
3.3.1 CSR也采用ASN.1标準描述,整體格式是:
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo, # 證書的請求資訊
signatureAlgorithm AlgorithmIdentifier, # 簽名算法
signature BIT STRING # 簽名資訊
}
3.3.2 CertificationRequestInfo結構:
CertificationRequestInfo ::= SEQUENCE{
version INTEGER { v1(0) } (v1,...),
subject Name,
subjectPKInfo SubjectPublicKeyInfo,
attributes [0] Attributes
- version: 表示 PKCS#10 标準的版本号;
- subject : 表示伺服器主體的可分辨名稱DN,最重要的是CN值,表示證書需要包含的域名,可以包含多個;
- subjectPKInfo: 伺服器密鑰對的公鑰,可以是RSA公鑰或ECDSA公鑰。伺服器主體使用該密鑰對的私鑰對certificationRequestInfo進行數字簽名最終生成CSR檔案。
3.3.3 CSR生成過程
- 伺服器主體生成一對密鑰對,如RSA密鑰對;
- 生成CertificationRequestInfo結構體,主要包含域名、公鑰;
- 使用私鑰對CertificationRequestInfo進行數字簽名得到簽名值;
- 組合CertificationRequestInfo資訊和簽名得到最終的CSR檔案。
3.3.4 證書擴充
擴充有标準和非标準兩種,每個擴充都是一個OLD ASN.1結構。每個擴充都有一個critical屬性,如果該屬性值為true,CA必須嚴格處理。
3.3.5 證書分類
根據驗證模式分類
- DV(Domain Validated)證書:最常見的一種證書類型,CSR包含域名資訊,CA檢驗域名所有權,如果通過稽核,申請者就有權申請該域名的證書。校驗方式有DNS TXT記錄方式、伺服器放置特殊檔案方式。
- OV(Organization Validated)證書:CA機構對申請者的身份進行嚴格的稽核,確定申請者的身份是真實的。申請時間比DV證書要長。
- EV(Extended Validation)證書:對申請者進行更嚴格的稽核。
根據域名分類
- 單域名證書
- 泛域名證書
- SAN(Subject Alternative Names)證書,可以把多個不同的注冊域名合并到一張證書。
- SAN泛域名證書。
四、 證書鍊
1. 證書類型
(1) 在Chrome中看CSDN的證書:
- 伺服器實體在配置HTTPS的時候,不隻是配置伺服器實體證書,還涉及其它證書;
- 證書鍊的了解:
- DigiCert信任了GeoTrust RSA CA 2018
- GeoTrust RSA CA 2018信任了*.csdn.net
上面證書類型分為了:
- 伺服器實體證書
- 中間證書
- 根證書:自簽名證書,位于證書鍊中的最頂端。
在使用Certbot用戶端工具生成的證書中,fullchain.pem包含了cert.pem和chain.pem檔案的内容,構成了完整的證書鍊。cert.pem在fullchain.pem檔案的最頂端。
根證書預嵌入到了浏覽器中,配置Nginx和Apache的時候,隻需要fullchain.pem,不需要包含根證書。
(2) 使用openssl指令檢視網站證書情況
openssl s_client -connect www.csdn.net:443 | openssl x509 -noout -subject -issuer
與上圖Chrome檢視證書情況可以對照檢視。
2. 信任鍊校驗
- 浏覽器連接配接至一個https網站
-
伺服器發完整證書給浏覽器,如fullchain.pem。對X.509标準來說,伺服器應該發送完整的證書鍊(不包含根證書)。如果發送的證書不完整,用戶端可以找到所有的證書鍊,但有的浏覽器可能不會這樣做,造成不相容。
通過伺服器實體證書找到完整證書鍊的方法,從中解析CA密鑰辨別符,進而擷取上一級中間證書檔案,通過中間證書的CA密鑰辨別符繼續向上找到根證書。
-
校驗證書鍊關系
浏覽器要信任每張證書,必須確定每個證書(除了根證書)的簽發者都是它的上一級證書的使用者(subject)。如果不符合,證書校驗就會失敗。
3. 根證書
Linux各個發行版中,OpenSSL庫會內建根證書
openssl version -a
windows
在
HKEY_CURRENT_USER
系統資料庫管理根證書
windows的證書可視化管理工具:
certmgr.msc
Mozilla
在NSS底層獨立維護了可信任的根證書庫。
五、CRL 證書吊銷清單
CRL(Certificate Revocation List),是PKI技術的重要組成部分。CRL是TLS/SSL協定的一部分,X.509 V2 标準定義了CRL的文法和語義資訊,CRL結構類似于證書,也使用ASN.1 結構來解釋其含義。
六、OCSP
CRL正逐漸被OCSP替代(線上證書狀态協定,Online Certificate Status Protocol),定義在RF6960文檔中,主要目的是為了替換CRL,更好地核實證書的使用。
七、證書格式
1. DER
ASN.1是一種抽象的資料結構,描述了複雜的對象。證書本質是一個檔案,要通過一個規則把ASN.1轉換為二進制檔案。 在X.509證書中,使用的編碼方式是 Distinguished Encoding Rules(DER)。
2. BER
Basic Encoding Rules(BER)是DER的一個子集。
3. CER
CER是另一種編碼标準,用來編碼ASN.1結構
4. PEM
DER是個二進制檔案,為了友善傳輸,可以将DER轉換為PEM(Privacy enhanced Electronic mail)格式。 PEM是Base64編碼方式,以:
-----BEGIN CERTIFICATE-----
開頭,
-----END CERTIFICATE-----
結尾。
5. 編碼轉換
PEM轉為DER
openssl x509 -in cert.pem -out cert.der -outform DER
DER轉為PEM
openssl x509 -in cert.der -inform DER -out cert.pem -outform PEM
6. 其它的證書格式
7.6.1 PKCS#12(字尾.pkcs12 .pfx .p12)
非對稱加密的一種格式,微軟推出。PKCS#12把證書和密鑰對打包成一個檔案,還可以再對檔案進行加密保護。
通過OpenSSL pkcs12子指令将密鑰對(privkey.pem)、伺服器實體證書(cert.pem)、中間證書(chain.pem)轉換成一個檔案:
openssl pkcs12 -export -out cert.pfx \
-inkey privkey.pem -in cert.pem -certfile chain.pem
生成 cert.pfx時會提示進行密碼保護。可以再使用指令從pfx中再導出密鑰對和證書:
# 導出密鑰對
openssl pkcs12 -in cert.pfx -nodes -nocerts -out new_privkey.pem
# 導出伺服器實體證書
openssl pkcs12 -in cert.pfx -nodes -clcerts -out new_cert.pem
# 導出中間證書
openssl pkcs12 -in cert.pfx -nodes -cacerts -out new_chain.pem
7.6.2 PKCS#7
主要用來進行數字簽名和資料加密,檔案字尾一般是.p7b或.p7c,使用OpenSSL crl2pkcs7進行操作。
# 生成 cert.p7b
openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile chain.pem -out cert.p7b
# 導出完整證書鍊檔案,伺服器實體證書在檔案頂部,中間證書在檔案底部
openssl pkcs7 -print_certs -in cert.p7b -out fullchain.cer
7.6.3 JKS
Java支援的符合X.509的證書格式。
7.6.4 BKS
BouncyCastleProvider,它使用的也是TripleDES來保護密鑰庫中的Key,它能夠防止證書庫被不小心修改(Keystore的keyentry改掉1個bit都會産生錯誤),BKS能夠跟JKS互操作。
由于安卓無法直接支援jks的證書庫,在安卓下一般需要使用BKS類型證書。
7. CSR管理
7.7.1 檢視CSR
前面使用OpenSSL指令生成了CSR檔案 , 下面使用指令檢視CSR檔案内容:
openssl req -in mykey_csr.pem -noout -text
- Subject Public Key Info : 生成的公鑰,包含了e和n等RSA資訊
- Signature Algorithm 表示簽名算法和簽名值。
7.7.2 校驗CSR簽名
openssl req -in myreq.pem -noout -verify -key mykey_csr.pem
八、導入根證書
- 有新成立了一個CA機構,要導入到根證書庫中
- 自簽名了一個證書,要導入根證書庫
-
系統根證書庫太舊
Linux下 指令行update-ca-certificates可以用來同步證書。
windows下可以輕按兩下.cer檔案彈出安裝證書界面。