證書與keytool


證書的來源與使用:

  1. 對數據進行簽名是我們在網絡中最常見的安全操作。簽名有雙重作用,作用一就是保證數據的完整性,證明數據並非偽造,而且在傳輸的過程中沒有被篡改,作用二就是防止數據的發布者否認其發布了該數據。簽名同時使用了非對稱性加密算法和消息摘要算法,對一塊數據簽名時,會先對這塊數據進行消息摘要運算生成一個摘要,然后對該摘要使用發布者的私鑰進行加密。接收者接受這塊數據后,先使用發布者的公鑰進行解密得到原數據的摘要,再對接收到的數據計算摘要,如果兩個摘要相同,則說明數據沒有被篡改。同時,因為發布者的私鑰是不公開的,只要接收者通過發布者的公鑰能成功對數據進行解密,就說明該數據一定來源於該發布者。
  2. 那么怎么確定某公鑰一定是屬於某發布者的呢?這就需要證書了。證書由權威認證機構頒發,其內容包含證書所有者的標識和它的公鑰,並由權威認證機構使用它的私鑰進行簽名。信息的發布者通過在網絡上發布證書來公開它的公鑰,該證書由權威認證機構進行簽名,認證機構也是通過發布它的證書來公開該機構的公鑰,認證機構的證書由更權威的認證機構進行簽名,這樣就形成了證書鏈。證書鏈最頂端的證書稱為根證書,根證書就只有自簽名了。總之,要對網絡上傳播的內容進行簽名和認證,就一定會用到證書。關於證書遵循的標准,最流行的是 X.509,關於證書的具體內容,大家可以在網上搜集更詳細的資料。

keytool

  • 在Java中也廣泛使用證書,JDK中創建和管理證書的工具是keytoolkeytool是一個功能強大的安全工具,它不僅僅只是用來創建和管理證書,還可以用來創建和管理對稱性加密算法需要用到的密鑰,keytool使用keystore存儲密鑰和證書,在一個keystore中可以存儲多個條目,訪問keystore和訪問keystore中的條目均需要密碼。

  • keytool 是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用於(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)或數據完整性以及認證服務。在JDK 1.4以后的版本中都包含了這一工具,它的位置為%JAVA_HOME%\bin\keytool.exe,如下圖所示:

  • keytool的用法:

  • keytool創建和管理證書:

  1. 由於keytool是JDK自帶的,所以大家可以放心不用另外下載,要進行非對稱性加密,我們首先要有屬於自己的私鑰/公鑰對,這可以通過keytool -genkeypairs -alias xxx命令得到。創建密鑰對的時候,keytool會在keystore 中生成一個新的條目,-alias xxx選項就是對該條目進行命名。生成密鑰對之后,私鑰是以原始數據直接儲存在 keystore 中的,而公鑰是要發布出去的,所以它被封裝在一個X.509格式的自簽名證書中。換句話說,創建密鑰對的時候,同時就創建了一個自簽名的證書。

  2. 首先,我先假設一個只對我自己簽發證書的私有認證機構,我稱之為MyCA(CA是一個證書管理機構),先為MyCA生成一個自簽名的根證書,使用的命令是keytool -genkeypair -alias MyCA,如下圖所示:

  3. 我們可以看到,除了提示我們輸入keystore的密碼和MyCA條目的密碼之外,還提示我們輸入名字、部門、組織、區域、國家代碼等信息,這些信息主要是用來標識證書的所有者。按提示完成操作后,就在keystore中生成了一個MyCA條目,該條目中保存有MyCA的私鑰和MyCA的自簽名證書,該證書中包含 MyCA 的公鑰。使用keytool -list命令看一下,可以看到 keystore中新增的MyCA條目:

  4. 如果給keytool -list命令增加-v選項,則可以看到更加詳細的內容。這些內容可以讓我們對MyCA的證書有更直觀的了解,如下圖所示,你會發現證書的所有者和證書的發布者相同,說明這是一個自簽名證書。

  5. 然后,我再按上述方法生成一個密鑰對,使用命令keytool -genkeypair -alias Java命令,按提示完成操作后,keystore中就又多了一個Java條目,如下圖:

  6. 自簽名的證書可以使用,但是總不如認證機構頒發的證書權威。要想讓CA為我們頒發證書,首先我們要向 CA 提交申請,提交申請的時候需要提交一份稱為certificate request的數據。我們可以通過keytool -certreq命令針對 keystore中相應的條目生成該數據。在這里,我想讓CA給Java頒發證書,則使用keytool -certreq -alias Java來生成 certificate request,如圖所示:

  7. 從上圖中可以看到,生成的certificate request數據是Base64編碼的。然后,將該申請提交給CA。當然,現實中的CA是要收費的,而且還不便宜。那么我只好自己提交給自己了,使用私有的MyCA來給Java頒發證書。首先我利用指令keytool -certreq -alias Java>Java.certreq,這里的>符號是重定向操作符,可以將生成的certificate request數據保存在文件Java.certreq中,再使用命令keytool -gencert -alias MyCA -infile Java.certreq -outfile Java.cer,文件Java.cer就是由MyCA頒發的證書。使用keytool -printcert -v -file Java.cer命令可以查看該證書,這時可以看到所有者和發布者不不一樣了:

  8. 申請者收到CA頒發的證書后,可以使用keytool -importcert -alias Java -file Java.cer將證書導入到 keystore中。導入證書后,再使用keytool -list -v -alias Java查看,會看到完整的證書鏈,如下圖:

  9. 作為管理工具,keytool當然提供導出證書的功能,使用keytool -exportcert命令即可,當然我們還可以用keytool -delete -alias xxx來刪除條目,關於keytool更詳細的參數,大家可以通過在命令提示符下輸入keytool -help來查看,推薦參考Java中keytool的使用總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM