筆者的這篇文章參考了http://docs.oracle.com/cd/E19509-01/820-3503/ggfgo/index.html
KeyStore和TrustStore在很多HTTPS雙向配置的文章中基本沒有明白的,可能是因為當前的HTTPS網站太少,得不到重視,都是照着別人的抄一遍,然后運行一下。
KeyStore是服務器的密鑰存儲庫,存服務器的公鑰私鑰證書
TrustStore是服務器的信任密鑰存儲庫,存CA公鑰,但有一部分人存的是客戶端證書集合,這樣並不合適
下面是幾個常見的錯誤
1.KeyStore和TrustStore做成同一個JKS文件或PKCS12文件。通過導入客戶端證書來實現驗證客戶端證書。實際生產中並不能這么做,客戶端有成千上萬個,你不可能都去導吧。
2.openssl生成CA、server、client證書,用同樣的方法轉成PKCS12文件,KeyStore指定server.p12,TrustStore指定CA.p12、瀏覽器證書個人存儲區存client.p12,受信任的根證書頒發機構存CA.p12,總體思路是對的,但是CA這里這里絕對不能將私鑰也導入到PKCS12中,一個正常的CA要是把CA私鑰泄露了那不就慘了。
下面進入主題
一、生成JKS格式的KeyStore
JKS與其他密鑰存儲可有一個區別就是,不僅密鑰存儲庫可以設置密碼,並且里面的條目也可以設置密碼,條目如果不設置密碼默認與密鑰庫密碼一致,條目可以存證書、密鑰對,但是私鑰不能直接導出
1.生成密鑰庫
不能單純的生成一個密鑰庫,生成密鑰庫的時候必須同時生成一個條目
下面這個命令在當前工作目錄生成了一個密鑰庫文件clientkeystore,里面存儲了一個別名為client的密鑰對
keytool -keystore clientkeystore -genkey -alias client
生成的時候提示:您的名字與姓氏是什么?(What is your first and last name?)
這一步填服務器的域名即可,必須填
2.生成證書請求文件
根據client密鑰對生成證書請求文件,這個文件client.csr用於CA簽名
keytool -keystore clientkeystore -certreq -alias client -keyalg rsa -file client.csr
比較常見的CA有:http://www.verisign.com
如果簽署的證書在CA證書鏈中,那么導入cer文件即可,如果不在證書鏈中(比如我們自己創建的CA),你就需要導入CA證書文件
3.導入CA證書文件
下面這個命令用於導入CA證書文件
keytool -import -keystore clientkeystore -file CARoot.cer -alias theCARoot
4.導入簽名后的證書文件
如果CA對client.csr簽名了,那么你會得到一個client.cer的證書文件,下面你可以導入這個簽名后的證書文件
keytool -import -keystore clientkeystore -file client.cer -alias client
二、生成PKCS12格式的KeyStore
JKS格式的密鑰存儲庫不能導出私鑰,這是個缺陷,下面我們來看PKCS12格式
下面都是用openssl工具來生成
下面這個命令是將pem格式的私鑰mykey.pem.txt與pem格式的證書mycertificate.pem.txt合並成一個文件mykeycertificate.pem.txt
cat mykey.pem.txt mycertificate.pem.txt>mykeycertificate.pem.txt
將上面合並的文件作為一個條目存儲pkcs12存儲庫中,生成過程中必須輸入密碼
openssl pkcs12 -export -in mykeycertificate.pem.txt -out mykeystore.pkcs12 -name myAlias -noiter -nomaciter
三、生成TrustStore
命令
keytool -import -file C:\cascerts\firstCA.cert -alias firstCA -keystore myTrustStore
如果是多級CA,可能還需要導入secondCA和thirdCA