1. 程式人生 > >HTTPS之金鑰知識與金鑰工具Keytool和Keystore-Explorer

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

# 1 簡介 之前文章《[Springboot整合https原來這麼簡單](https://www.pkslow.com/archives/springboot-ssl-basic)》講解過一些基礎的密碼學知識和`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檔案: ```tex -----BEGIN ENCRYPTED PRIVATE KEY----- XXX -----END ENCRYPTED PRIVATE KEY----- ``` CSR檔案: ```tex -----BEGIN CERTIFICATE REQUEST----- XXX -----END CERTIFICATE REQUEST----- ``` Public key檔案: ```tex -----BEGIN PUBLIC KEY----- XXX -----END PUBLIC KEY----- ``` Cert檔案: ```tex -----BEGIN CERTIFICATE----- XXX -----END CERTIFICATE----- ``` # 3 金鑰工具 金鑰工具有許多,常用的有`openssl`和`keytool`。 ## 3.1 keytool常用命令 `keytool`是JDK提供的金鑰命令列工具,功能強大,語義清晰明瞭。常用的命令有: ```bash # 生成一個金鑰對 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 ``` 更多命令請參考幫助文件或網上吧。 ## 3.2 視覺化工具Keystore Explorer 在Linux終端等只能通過命令列方式來操作金鑰,但命令和引數這麼多,記住是不太可能的,那總不能每次都要上網查吧,萬一連不上網了呢? 還好有優秀免費的視覺化工具**Keystore Explorer**,官方網址為https://keystore-explorer.org/index.html ,可以在Windows或Mac開發使用,最後再把檔案上傳到伺服器即可。介面如下: ![Keystore Explorer](https://img2020.cnblogs.com/other/946674/202004/946674-20200427125717549-990153744.png) 非常簡單易用又功能強大,大大減少了記憶勞動。不管是生成Key、匯入匯出、轉換格式、生成CSR等,都很容易。所以,就不一一截圖介紹了。 # 4 總結 本文主要講解了金鑰知識和金鑰工具。金鑰知識比較重要,暫時就想到這些,以後再慢慢補充,最新文章可以到(www.pkslow.com) 訪問。金鑰工具有命令列工具和視覺化工具,大家按自己需求選擇。 --- 歡迎訪問[南瓜慢說 www.pkslow.com](https://www.pkslow.com/)獲取更多精彩文章! 歡迎關注微信公眾號<**南瓜慢說**>,將持續為你更新... ![](https://img2020.cnblogs.com/other/946674/202004/946674-20200427125717772-403815257.jpg) **多讀書,多分享;多寫作,多整