使用keytool創(chuàng)建和管理證書
在 Java 中也廣泛使用證書,例如,使用 jarsigner 命令對 jar 包進(jìn)行簽名和認(rèn)證。JDK 中創(chuàng)建和管理證書的工具是 keytool 。 keytool 是一個功能強大的安全工具,它不僅僅只是用來創(chuàng)建和管理證書,還可以用來創(chuàng)建和管理對稱性加密算法需要用到的密鑰,還可以用自己的證書給別人簽發(fā)證書(類似 CA 的工作),還可以導(dǎo)入別人發(fā)布的證書。 keytool 使用 keystore 存儲密鑰和證書,在一個 keystore 中可以存儲多個條目,訪問 keystore 和訪問 keystore 中的條目均需要密碼。
下面開始實戰(zhàn)。要進(jìn)行非對稱性加密,我們首先要有屬于自己的私鑰/公鑰對,這可以通過 keytool -genkeypairs -alias xxx 命令得到。創(chuàng)建密鑰對的時候, keytool 會在 keystore 中生成一個新的條目, -alias xxx 選項就是對該條目進(jìn)行命名。生成密鑰對之后,私鑰是以原始數(shù)據(jù)直接儲存在 keystore 中的,而公鑰是要發(fā)布出去的,所以它被封裝在一個 X.509 格式的自簽名證書中。換句話說,創(chuàng)建密鑰對的時候,同時就創(chuàng)建了一個自簽名的證書。
先將自己假想為一個認(rèn)證機構(gòu),或者說一個只對我自己簽發(fā)證書的私有認(rèn)證機構(gòu),我稱之為 MyCA,先為 MyCA 生成一個自簽名的根證書,使用的命令是 keytool -genkeypair -alias MyCA ,如下圖:

可以看到,除了提示我們輸入 keystore 的密碼和 MyCA 條目的密碼之外,還提示我們輸入名字、部門、組織、區(qū)域、國家代碼等信息,這些信息主要是用來標(biāo)識證書的所有者。按提示完成操作后,就在 keystore 中生成了一個 MyCA 條目,該條目中保存有 MyCA 的私鑰和 MyCA 的自簽名證書,該證書中包含 MyCA 的公鑰。使用 keytool -list 命令看一下,可以看到 keystore 中新增的 MyCA 條目。
如果給 keytool -list 命令增加 -v 選項,則可以看到更加詳細(xì)的內(nèi)容。這些內(nèi)容可以讓我們對 MyCA 的證書有更直觀的了解,如下圖:

然后,再為我自己生成一個密鑰對,使用命令 keytool -genkeypair -alias youxia 命令,按提示完成操作后,keystore 中就又多了一個 youxia 條目,如下圖:

使用 keytool -list -v -alias youxia 命令可以查看 youxia 的證書,它也是自簽名的,如下圖:

自簽名的證書可以使用,但是總不如認(rèn)證機構(gòu)頒發(fā)的證書權(quán)威。怎么樣讓 CA 為我們頒發(fā)證書呢?首先我們要向 CA 提交申請,提交申請的時候需要提交一份稱為 certificate request 的數(shù)據(jù)。我們可以通過 keytool -certreq 命令針對 keystore 中相應(yīng)的條目生成該數(shù)據(jù)。在這里,我想讓 CA 給 youxia 頒發(fā)證書,則使用 keytool -certreq -alias youxia 來生成 certificate request,我同時使用管道和 tee 命令讓生成的數(shù)據(jù)既顯示在控制臺中,又保存在文件 youxia.certreq 中,如下圖:

從上圖中可以看到,生成的 certificate request 數(shù)據(jù)是 Base64 編碼的。然后,將該申請?zhí)峤唤o CA。當(dāng)然,現(xiàn)實中的 CA 那都是要收費的,而且還不便宜。那么我只好自己提交給自己了,使用私有的 MyCA 來給 youxia 頒發(fā)證書。使用的命令為 keytool -gencert -alias MyCA -infile youxia.certreq -outfile youxia.cer,文件 youxia.cer 就是由 MyCA 頒發(fā)的證書。使用 keytool -printcert -v -file youxia.cer 命令可以查看該證書。
然后,申請者收到 CA 頒發(fā)的證書后,可以使用 keytool -importcert -alias youxia -file youxia.cer 將證書導(dǎo)入到 keystore 中。導(dǎo)入證書后,再使用 keytool -list -v -alias youxia 查看,會看到完整的證書鏈,如下圖:

作為管理工具,keytool 當(dāng)然提供導(dǎo)出證書的功能,使用 keytool -exportcert命令即可。至此,我們已經(jīng)完全了解了生成密鑰對和證書的完整流程。關(guān)于 keytool 更詳細(xì)的參數(shù),請大家自己查看 keytool 的文檔吧。