摘要:個(gè)人信息交換格式,也稱為支持安全存儲(chǔ)證書私鑰和證書路徑中的所有證書。由,標(biāo)準(zhǔn)定義,以作為證書文件后綴名。加密消息語法標(biāo)準(zhǔn),格式支持證書的存儲(chǔ)和認(rèn)證路徑中的所有證書。客戶端的證書也采用根證書簽名,服務(wù)器端對(duì)客戶端進(jìn)行證書認(rèn)證。
前言
在我們不論是對(duì)服務(wù)器還是客戶端進(jìn)行 HTTPS 進(jìn)行配置時(shí),首先需要準(zhǔn)備好的肯定是相關(guān)證書文件了,而證書文件是什么又從哪里可以獲取到相關(guān)證書,并且它們又是什么關(guān)系,最后它們?cè)趺丛谕ㄓ嵵衅鹱饔媚兀靠赡芎芏嗳硕疾皇呛芟到y(tǒng)的清楚這一塊;趁現(xiàn)在有空整理出來給大家入門了解下。
名詞解釋RSA:它是一種非對(duì)稱的加密算法,里面密鑰是一對(duì)的,分別是公鑰和私鑰;一般公鑰是由私鑰生成的;公鑰就是公開的密鑰,可以公開給大家的,而私鑰則是需要自己保管好的不能公開的密鑰;它們互相解密,即用公鑰加密用私鑰加密,反之亦然。
數(shù)字簽名:數(shù)字簽名不是用來加解密數(shù)據(jù)的,而是用來驗(yàn)證數(shù)據(jù)正確性,判斷是否被篡改,場(chǎng)景就類似在一篇文章上簽上自己的名字供給別人驗(yàn)證文章是你撰寫的;而數(shù)字簽名就是利用私鑰對(duì)原始數(shù)據(jù)的摘要(Hash 值)進(jìn)行加密出來的。
數(shù)字證書:從名字來說就可以看出來,數(shù)字證書和數(shù)字簽名很相似,但是不要把兩者混淆,數(shù)字證書的生成是用到了數(shù)字簽名的技術(shù)而已;數(shù)字證書一般由可信的權(quán)威機(jī)構(gòu) CA 證書授權(quán)(Certificate Authority)中心頒發(fā)的。持有人將公鑰以及身份信息發(fā)送給 CA 機(jī)構(gòu)進(jìn)行頒發(fā)生成證書,證書文件中包括持有人公鑰、身份信息以及 CA 機(jī)構(gòu)用其 CA 的私鑰對(duì)其進(jìn)行的數(shù)字簽名(后面握手連接中會(huì)用到 CA 自身的數(shù)字證書中的公鑰對(duì)其進(jìn)行校驗(yàn),這個(gè)證書叫做 CA 根證書,一般都集成在操作系統(tǒng)中),一般是最常見格式由X.509定義。
CSR:是 Certificate Signing Request 的縮寫,即證書簽名請(qǐng)求,這不是證書,可以簡(jiǎn)單理解成公鑰,生成證書時(shí)要把這個(gè)提交給權(quán)威的證書頒發(fā)機(jī)構(gòu)。
CRT:即 certificate 的縮寫,即證書。
X.509:是一種證書格式,對(duì) X.509 證書來說,認(rèn)證者總是 CA 或由 CA 指定的人,一份 X.509 證書是一些標(biāo)準(zhǔn)字段的集合,這些字段包含有關(guān)用戶或設(shè)備及其相應(yīng)公鑰的信息。X.509 的證書文件,一般以 .crt 為后綴名,根據(jù)該文件的內(nèi)容編碼格式,可以分為二種格式:PEM - Privacy Enhanced Mail,打開看文本格式以 "-----BEGIN..."、"-----END..." 開頭和結(jié)尾,內(nèi)容是 Base64 編碼,文件名以 .pem、.crt、.cer 為后綴名;Apache 和 Nginx 服務(wù)器偏向于使用這種編碼格式;DER - Distinguished Encoding Rules,打開看是二進(jìn)制格式,不可讀,文件名以 .der、.crt、.cer 為后綴名;Java 和 Windows 服務(wù)器偏向于使用這種編碼格式。從后綴名看出 CER 和 CRT 擴(kuò)展幾乎是同義詞。
PKCS #12:個(gè)人信息交換格式(PFX,也稱為PKCS 12)支持安全存儲(chǔ)證書、私鑰和證書路徑中的所有證書。PKCS 12格式是唯一可用于導(dǎo)出證書及其私鑰的文件格式。由 Public Key Cryptography Standards #12,PKCS#12 標(biāo)準(zhǔn)定義,以 .pfx、.p12 作為證書文件后綴名。
PKCS #7:加密消息語法標(biāo)準(zhǔn)(PKCS #7),PKCS 7 格式支持證書的存儲(chǔ)和認(rèn)證路徑中的所有證書。
正文 獲取證書為了獲取證書前,我們需要生成自己的一對(duì)公鑰和私鑰。在這里我們會(huì)使用到一個(gè)叫做 OpenSSL 的工具庫。
自簽名證書,無 CA 簽名生成密鑰與證書
# 生成私鑰文件 $ openssl genrsa -out server.key 2048 # 也可以通過指定加密算法來生成加密的文件,通過 "openssl genrsa -help" 查看支持的算法 $ openssl genrsa -aes128 -out server.key 2048 # 生成證書文件 $ openssl req -new -x509 -days 3650 -subj "/C=CN/L=Guangzhou/O=Guangzhou Example Technology Co., Ltd/CN=example.com" -key server.key -out server.crt # e.g. 百度的證書中的身份信息 CN = baidu.com # Common Name(證書所請(qǐng)求的域名) O = Beijing Baidu Netcom Science Technology Co., Ltd # Organization Name OU = service operation department # Organization Unit Name L = beijing # Locality Name S = beijing # Sate or Province Name C = CN # Country NameCA 簽名證書(非機(jī)構(gòu))
# 生成 CA 根證書 $ openssl genrsa -out ca.key 2048 $ openssl req -new -x509 -days 3650 -subj "/C=CN/L=Guangzhou/O=CA Technology Co., Ltd/CN=XXX Global Root CA" -key ca.key -out ca.crt # 生成 .csr 證書簽名請(qǐng)求文件 $ openssl req -new -subj "/C=CN/L=Guangzhou/O=Guangzhou Example Technology Co., Ltd/CN=example.com" -key server.key -out server.csr # 使用 CA 根證書頒發(fā)服務(wù)器證書 $ openssl x509 -req -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -in server.csr -out server.crt它們的關(guān)系與作用
在 HTTP 協(xié)議傳輸下,數(shù)據(jù)都是以明文進(jìn)行傳輸,數(shù)據(jù)安全性得不到保障;使用 HTTPS 加密通訊后,數(shù)據(jù)保密和不可篡都得到進(jìn)一步的保障;根據(jù) HTTPS 服務(wù)器不同的配置方式,安全性也是不盡相同,下面就是常見的 3 種方式:
無 CA 簽名服務(wù)器證書這種方式需要提前將服務(wù)器的證書告知客戶端,這樣客戶端在鏈接服務(wù)器時(shí)才能進(jìn)行對(duì)服務(wù)器證書認(rèn)證。
通訊過程(簡(jiǎn)化)
client ----(tcp three way handshake)-----> server client ----(Client Hello)-----> server client <----(Server Hello,public key)----- server client (通過事先保存本地的 server.crt 和服務(wù)器發(fā)過來的 server.crt 進(jìn)行比較) client ----(客戶端生成對(duì)稱密鑰,通過 server.crt 提取 public key 進(jìn)行加密發(fā)送)-----> server client ----(密鑰交換后,按照對(duì)稱密鑰進(jìn)行加密通訊)-----> server
在復(fù)雜的網(wǎng)絡(luò)環(huán)境中,服務(wù)器證書的傳輸本身也是一個(gè)非常危險(xiǎn)的問題。如果在中間某個(gè)環(huán)節(jié),服務(wù)器證書被監(jiān)聽或替換那么對(duì)服務(wù)器的認(rèn)證也將不再可靠。
CA 簽名服務(wù)器證書為了避免證書的傳遞過程中被篡改,可以通過一個(gè)安全可靠的 CA 根證書分別對(duì)服務(wù)器和客戶端的證書進(jìn)行簽名。這樣客戶端或服務(wù)器在收到對(duì)方的證書后可以通過根證書進(jìn)行驗(yàn)證證書的有效性。
通訊過程(簡(jiǎn)化)
client ----(tcp three way handshake)-----> server client ----(Client Hello)-----> server client <----(Server Hello,public key)----- server client (通過 CA 根證書對(duì)服務(wù)器發(fā)過來的 server.crt 進(jìn)行合法性驗(yàn)證) client ----(客戶端生成對(duì)稱密鑰,通過 public key 進(jìn)行加密發(fā)送)-----> server client ----(密鑰交換后,按照對(duì)稱密鑰進(jìn)行加密通訊)-----> server雙向 CA 簽名證書
上面 2 種都是由客戶端單向驗(yàn)證的,這種則是客戶端服務(wù)器雙向相互驗(yàn)證。
客戶端通過引入一個(gè) CA 根證書和服務(wù)器的名字來實(shí)現(xiàn)對(duì)服務(wù)器進(jìn)行驗(yàn)證。客戶端在連接服務(wù)器時(shí)會(huì)首先請(qǐng)求服務(wù)器的證書,然后使用 CA 根證書對(duì)收到的服務(wù)器端證書進(jìn)行驗(yàn)證。客戶端的證書也采用 CA 根證書簽名,服務(wù)器端對(duì)客戶端進(jìn)行證書認(rèn)證。
通訊過程(簡(jiǎn)化)
client ----(tcp three way handshake)-----> server client ----(Client Hello)-----> server client <----(Server Hello,public key)----- server client (通過 CA 根證書對(duì)服務(wù)器發(fā)過來的 server.crt 進(jìn)行合法性驗(yàn)證) client ----(客戶端生成對(duì)稱密鑰,通過 public key 進(jìn)行加密發(fā)送,并發(fā)送客戶端 client.crt)-----> server server (服務(wù)端使用 CA 根證書對(duì) client.crt 進(jìn)行做法性校驗(yàn)) client ----(密鑰交換后,按照對(duì)稱密鑰進(jìn)行加密通訊)-----> server
這種常見于網(wǎng)銀系統(tǒng)等交易系統(tǒng)的網(wǎng)站或者 API 使用,確保客戶端攜帶證書進(jìn)行訪問;當(dāng)無證書的客戶端無法進(jìn)行訪問,當(dāng)訪問時(shí)會(huì)出現(xiàn) 400 Bad Reques
瀏覽器證書導(dǎo)入需要裝換為 PKCS #12 證書文件才能導(dǎo)入,命令如下:
openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx # 輸入口令,導(dǎo)入證書后再請(qǐng)求則會(huì)彈出選擇證書的選項(xiàng)就正常訪問了Nginx 配置 etc. 從 JKS 文件中提取服務(wù)證書
說明:JKS 文件擴(kuò)展名是 .jks 或 .keystore
查看jks文件中的entry
keytool -list -keystore server.jks
將”.jks”轉(zhuǎn)為”.p12”(PKCS12格式的證書庫)
keytool -importkeystore -srckeystore server.jks -srcalias tomcat -destkeystore server.p12 -deststoretype PKCS12
得到配置服務(wù)器使用的 server.crt、server.key、ca.crt 文件
openssl pkcs12 -in server.p12 -nodes -nocerts -out server.key openssl pkcs12 -in server.p12 -nodes -nokeys -clcerts -out server.crt openssl pkcs12 -in server.p12 -nodes -nokeys -cacerts -out ca.crt
使用加密的私鑰配置 Nginx 支持 SSL 時(shí),并使用下面命令去除私鑰必須的口令(否則 start、reload 都得輸入密碼)
$ cp server.key server.key.org $ openssl rsa -in server.key.org -out server.keyNginx 配置
server { listen 443 ssl; server_name localhost; ssl on; ssl_certificate ../cert/server.crt; ssl_certificate_key ../cert/server.key; ssl_client_certificate ../cert/ca.crt; ssl_verify_client on; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8080; } }參考
RSA (cryptosystem):https://en.wikipedia.org/wiki...
Digital signature:https://en.wikipedia.org/wiki...
Public key certificate:https://en.wikipedia.org/wiki...
Subject Alternative Name:https://en.wikipedia.org/wiki...
使用 OpenSSL 制作一個(gè)包含 SAN(Subject Alternative Name)的證書:https://my.oschina.net/sskxyz...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40120.html
摘要:地址每次面試多多少少都會(huì)被問到等等之類協(xié)議,協(xié)議相關(guān)的問題也可以說是面試必備,所以我把這些知識(shí)單獨(dú)收集成了一篇文章。即標(biāo)志位和標(biāo)志位均為。發(fā)送完畢后,服務(wù)器端進(jìn)入狀態(tài)。認(rèn)證服務(wù)器對(duì)客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。 Git 地址:https://github.com/todayqq/PH... 每次面試多多少少都會(huì)被問到 HTTP、HTTPS、TCP、Socket、 OAu...
摘要:是不保存狀態(tài)的協(xié)議是無狀態(tài)的,也就是說,它是不對(duì)通信狀態(tài)進(jìn)行保存的。提升傳輸效率在說明之前,首先我們要知道什么是實(shí)體主體實(shí)體主體就是作為數(shù)據(jù)在中傳輸?shù)臄?shù)據(jù)。一般地,實(shí)體主體可以等價(jià)為報(bào)文主體,報(bào)文主體是中的一部分。 為什么要學(xué)HTTP? 我們絕大多數(shù)的Web應(yīng)用都是基于HTTP來進(jìn)行開發(fā)的。我們對(duì)Web的操作都是通過HTTP協(xié)議來進(jìn)行傳輸數(shù)據(jù)的。 簡(jiǎn)單來說,HTTP協(xié)議就是客戶端和服務(wù)...
摘要:擴(kuò)展閱讀收集的前端面試題和答案前端開發(fā)面試題史上最全的前端面試題匯總及答案前端工程師手冊(cè)協(xié)議工作原理協(xié)議運(yùn)行機(jī)制的概述 本書的 GitHub 地址:https://github.com/todayqq/PH... 對(duì)于大公司,很少會(huì)有全棧工程師這個(gè)崗位,全棧是個(gè)花哨的詞,對(duì)于現(xiàn)在比較熱門的技術(shù),不論是 Vue 還是 Laravel,只要智商不差,看著文檔,都能寫出一個(gè) CURD 來,...
閱讀 2781·2021-11-19 11:30
閱讀 3065·2021-11-15 11:39
閱讀 1787·2021-08-03 14:03
閱讀 1995·2019-08-30 14:18
閱讀 2051·2019-08-30 11:16
閱讀 2163·2019-08-29 17:23
閱讀 2606·2019-08-28 18:06
閱讀 2540·2019-08-26 12:22