簡述 HTTPS 證書認證

2021-09-13 10:40:56 字數 4382 閱讀 6591

在我們不論是對伺服器還是客戶端進行 https 進行配置時,首先需要準備好的肯定是相關證書檔案了,而證書檔案是什麼又從**可以獲取到相關證書,並且它們又是什麼關係,最後它們怎麼在通訊中起作用呢?可能很多人都不是很系統的清楚這一塊;趁現在有空整理出來給大家入門了解下。

為了獲取證書前,我們需要生成自己的一對公鑰和私鑰。在這裡我們會使用到乙個叫做 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

cn = baidu.com # common name(證書所請求的網域名稱)

ca 簽名證書(非機構)
# 生成 ca 根證書

$ openssl genrsa -out ca.key 2048

$ openssl req -new -x509 -days 3650 \

-subj "/c=cn/l=guangzhou/o=ca technology co., ltd/cn=*** global root ca" \

-key ca.key -out ca.crt

# 生成 .csr 證書簽名請求檔案

$ openssl req -new \

-subj "/c=cn/l=guangzhou/o=guangzhou example technology co., ltd/cn=example.com" \

-key server.key \

-out server.csr

# 使用 ca 根證書頒發伺服器證書

$ openssl x509 -req -sha256 \

-ca ca.crt -cakey ca.key -cacreateserial -days 3650 \

-in server.csr \

-out server.crt

在 http 協議傳輸下,資料都是以明文進行傳輸,資料安全性得不到保障;使用 https 加密通訊後,資料保密和不可篡都得到進一步的保障;根據 https 伺服器不同的配置方式,安全性也是不盡相同,下面就是常見的 3 種方式:

無 ca 簽名伺服器證書

這種方式需要提前將伺服器的證書告知客戶端,這樣客戶端在鏈結伺服器時才能進行對伺服器證書認證。

通訊過程(簡化)

client ----(tcp three way handshake)-----> server

client ----(client hello)-----> server

client

client (通過事先儲存本地的 server.crt 和伺服器發過來的 server.crt 進行比較)

client ----(客戶端生成對稱金鑰,通過 server.crt 提取 public key 進行加密傳送)-----> server

client ----(金鑰交換後,按照對稱金鑰進行加密通訊)-----> server

在複雜的網路環境中,伺服器證書的傳輸本身也是乙個非常危險的問題。如果在中間某個環節,伺服器證書被監聽或替換那麼對伺服器的認證也將不再可靠。

ca 簽名伺服器證書

為了避免證書的傳遞過程中被篡改,可以通過乙個安全可靠的 ca 根證書分別對伺服器和客戶端的證書進行簽名。這樣客戶端或伺服器在收到對方的證書後可以通過根證書進行驗證證書的有效性。

通訊過程(簡化)

client ----(tcp three way handshake)-----> server

client ----(client hello)-----> server

client

client (通過 ca 根證書對伺服器發過來的 server.crt 進行合法性驗證)

client ----(客戶端生成對稱金鑰,通過 public key 進行加密傳送)-----> server

client ----(金鑰交換後,按照對稱金鑰進行加密通訊)-----> server

雙向 ca 簽名證書

上面 2 種都是由客戶端單向驗證的,這種則是客戶端伺服器雙向相互驗證。

客戶端通過引入乙個 ca 根證書和伺服器的名字來實現對伺服器進行驗證。客戶端在連線伺服器時會首先請求伺服器的證書,然後使用 ca 根證書對收到的伺服器端證書進行驗證。客戶端的證書也採用 ca 根證書簽名,伺服器端對客戶端進行證書認證。

通訊過程(簡化)

client ----(tcp three way handshake)-----> server

client ----(client hello)-----> server

client

client (通過 ca 根證書對伺服器發過來的 server.crt 進行合法性驗證)

client ----(客戶端生成對稱金鑰,通過 public key 進行加密傳送,並傳送客戶端 client.crt)-----> server

server (服務端使用 ca 根證書對 client.crt 進行做法性校驗)

client ----(金鑰交換後,按照對稱金鑰進行加密通訊)-----> server

這種常見於網銀系統等交易系統的**或者 api 使用,確保客戶端攜帶證書進行訪問;當無證書的客戶端無法進行訪問,當訪問時會出現400 bad reques

瀏覽器證書匯入需要裝換為 pkcs #12 證書檔案才能匯入,命令如下:

openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx

# 輸入口令,匯入證書後再請求則會彈出選擇證書的選項就正常訪問了

從 jks 檔案中提取服務證書

說明:jks 副檔名是 .jks 或 .keystore

檢視jks檔案中的entry

keytool -list -keystore server.jks
將」.jks」轉為」.p12」(pkcs12格式的證書庫)

keytool -importkeystore -srckeystore server.jks -srcalias tomcat -destkeystore server.p12 -deststoretype pkcs12
得到配置伺服器使用的server.crtserver.keyca.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 時,並使用下面命令去除私鑰必須的口令(否則 start、reload 都得輸入密碼)

$ cp server.key server.key.org

$ openssl rsa -in server.key.org -out server.key

nginx 配置
server 

}

HTTPS協議 TLS協議 證書認證過程解析

非對稱加解密 非對稱加密包含乙個金鑰對 公鑰和私鑰。公鑰可以公開,私鑰必須安全儲存。https建立連線時時非對稱加密,建立連線後是對稱加密 android官網https詳細 如上圖所示,資料可以被公鑰加密,加密後的資料只有持有私鑰才能進行解密。同理私鑰加密的資料,也只有對應的公鑰才能解密。建立htt...

HTTPS認證二 openssl生成證書及簽名

ca根證書 mkdir private 生成私鑰 key 檔案 openssl genrsa out private ca.key 2048 輸出generating rsa private key,2048 bit long modulus e is 65537 0x10001 private 目...

https證書安裝部署 https證書怎麼安裝

http和https是我們上網的時候經常見到的網路協議,當我們進入乙個 的時候,的網域名稱有時候是http開頭的,有時候又是https開頭的,可能你們會好奇,這兩者究竟有什麼區別呢?https證書又是什麼呢?安裝https的證書究竟有沒有什麼作用呢?安裝https證書的步驟如何,是簡單還是複雜呢?關...