HTTPS之密鑰知識與密鑰工具Keytool和Keystore-Explorer

1 簡介

之前文章《 》講解過一些基礎的密碼學知識和Springboot整合HTTPS。本文將更深入講解密鑰知識和密鑰工具。

2 密鑰知識-非對稱加密

這部分知識非常重要,理解了關鍵的密鑰知識,才能更好地在工作中去使用。需要注意的是,講的主要是非對稱加密的知識,對稱加密比較好理解,就不講述了。

(1)對於非對稱加密,密鑰分為私鑰(private key)公鑰(public key),它們是成對出現的,缺一不可,少一個都無法正常工作。

(2)如果用公鑰加密,就必須使用對應的私鑰解密,反之亦然。

(3)通常,私鑰是自己才擁有,公鑰是對外公開發布。因此,在服務器端一般我們使用的是私鑰,而在客戶端我們使用的則為公鑰。所以我們是在服務端使用私鑰對來自客戶端的用公鑰加密的數據進行解密,哈哈,這句話很繞。

(4)即使把公鑰公開了,只要密鑰長度合理(一般是1024或2048),目前的技術是無法通過公鑰來計算出私鑰的,所以我們認為它是安全的。

(5)那麼我們通過什麼來加密、什麼來解密呢?從功能上來說,既可以用公鑰加密、私鑰解密,也可以用私鑰加密,公鑰解密。但實際上,通常採用的是

公鑰加密、私鑰解密,因為只想密文只有我知道,不希望別人也能獲得我的信息,所以要使用私鑰來加密。試想想,如果把用私鑰加密後的信息暴露出去,而大家都可以擁有公鑰,也就意味著大家都可以解密,那我的加密還有什麼意義呢?

(6)對於簽名功能,我不希望有人來冒充我來簽名,所以是私鑰簽名,公鑰驗證,這樣才能確保簽名只屬於一個人呀,如果用公鑰來簽名,那不是大家都可以是南瓜慢說呢?

(7)非對稱加密是運算效率比較低的,為了提高效率,可以採用這樣的方案:使用非對稱加密來交換密鑰Key,然後用密鑰Key來進行對稱加密。不難理解,這個密鑰是由客戶端生成的,如果服務端來生成,那大家都知道了這個密鑰,就失去了意義。

(8)密鑰文件是用於存放私鑰和公鑰的文件,我們可以把私鑰和公鑰放一起,也可以分開放。而密鑰文件有許多格式:jks、p12、pem、cert等,要根據不用的服務器和客戶端選取。

(9)一個密鑰文件是可以同時存放多個私鑰和公鑰的,如.jks文件可以同時存放localhost和www.pkslow.com的私鑰。但要注意別名和CN名是不同的。

(10)生成cert文件的兩種方式:

第一種:自己生成密鑰和CSR(Certificate Signing Request,證書籤名請求文件),把CSR給CA機構,機構會生成一個cert文件給你,然後要把該cert文件導入到自己的密鑰文件裡。

第二種:直接在CA生成所有,然後會給回private key和cert文件,配置到服務器端使用即可。

(11)如何更新將要過期的cert?

Private Key沒有過期時間,可以通過自己的private key生成新的CSR,然後給CA重新生成cert;或者private key也重新生成,參加上面一條。

(12)更新了cert,客戶端要不要做什麼?

如果是通過CA來驗證的,是不需要的。如果是Self-Signed的,需要把cert給客戶端然後導入到客戶端的密鑰文件裡。

(13)作為文本格式的時候,密鑰的格式如下:

Private Key文件:

<code>-----BEGIN ENCRYPTED PRIVATE KEY-----
XXX
-----END ENCRYPTED PRIVATE KEY-----/<code>

CSR文件:

<code>-----BEGIN CERTIFICATE REQUEST-----
XXX
-----END CERTIFICATE REQUEST-----/<code>

Public key文件:

<code>-----BEGIN PUBLIC KEY-----
XXX
-----END PUBLIC KEY-----/<code>

Cert文件:

<code>-----BEGIN CERTIFICATE-----
XXX
-----END CERTIFICATE-----/<code>

3 密鑰工具

密鑰工具有許多,常用的有openssl和keytool。

3.1 keytool常用命令

keytool是JDK提供的密鑰命令行工具,功能強大,語義清晰明瞭。常用的命令有:

<code># 生成一個密鑰對
keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore localhost.jks -dname CN=localhost,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass changeit -keypass changeit

# 生成CSR文件
keytool -certreq -alias localhost -file localhost.csr -keystore localhost.jks -storepass changeit

# 導出一個cert文件
keytool -export -alias xxx -file xxx.cer -keystore xxx.jks

#導入一個cert文件
keytool -import -alais xxx -file xxx.cer -keystore xxx.jks

# 查看cert列表詳情
keytool -list -v -keystore xxx.p12 -storepass changeit -storetype PKCS12
keytool -list -v -keystore xxx.jks -storepass changeit -storetype JKS

#轉換JKS格式為P12
keytool -importkeystore -srckeystore xxx.jks -destkeystore xxx.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass changeit -deststorepassword changeit -srckeypass changeit
-destkeypass changeit -srcalias xxx -destalias xxx -noprompt
/<code>

更多命令請參考幫助文檔或網上吧。

3.2 可視化工具Keystore Explorer

在Linux終端等只能通過命令行方式來操作密鑰,但命令和參數這麼多,記住是不太可能的,那總不能每次都要上網查吧,萬一連不上網了呢?

還好有優秀免費的可視化工具Keystore Explorer,官方網址為https://keystore-explorer.org/index.html ,可以在Windows或Mac開發使用,最後再把文件上傳到服務器即可。界面如下:

HTTPS之密鑰知識與密鑰工具Keytool和Keystore-Explorer

Keystore Explorer

非常簡單易用又功能強大,大大減少了記憶勞動。不管是生成Key、導入導出、轉換格式、生成CSR等,都很容易。所以,就不一一截圖介紹了。

4 總結

本文主要講解了密鑰知識和密鑰工具。密鑰知識比較重要,暫時就想到這些,以後再慢慢補充。密鑰工具有命令行工具和可視化工具,大家按自己需求選擇。


分享到:


相關文章: