詳解SSL證書中的keystore
什麼是keystore
是java的密鑰庫、用來進行通信加密用的、比如數字簽名。keystore就是用來保存密鑰對的,比如公鑰和私鑰。
在keystore里,包含兩種數據:
密鑰實體(Key entity)——密鑰(secret key)又或者是私鑰和配對公鑰(採用非對稱加密)
可信任的證書實體(trusted certificate entries)——只包含公鑰
ailas(別名)每個keystore都關聯這一個獨一無二的alias,這個alias通常不區分大小寫
JDK中keytool常用命令:
-genkey 在用戶主目錄中創建一個默認文件」.keystore」,還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和證書
(在沒有指定生成位置的情況下,keystore會存在用戶系統默認目錄,如:對於window xp系統,會生成在系統的C:Documents and SettingsUserName文件名為「.keystore」)
-alias 產生別名
-keystore 指定密鑰庫的名稱(產生的各類信息將不在.keystore文件中)
-keyalg 指定密鑰的演算法 (如 RSA DSA(如果不指定默認採用DSA))
-validity 指定創建的證書有效期多少天
-keysize 指定密鑰長度
-storepass 指定密鑰庫的密碼(獲取keystore信息所需的密碼)
-keypass 指定別名條目的密碼(私鑰的密碼)
-dname 指定證書擁有者信息 例如: 「CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區域名稱,ST=州或省份名稱,C=單位的兩字母國家代碼」
-list 顯示密鑰庫中的證書信息 keytool -list -v -keystore 指定keystore -storepass 密碼
-v 顯示密鑰庫中的證書詳細信息
-export 將別名指定的證書導出到文件 keytool -export -alias 需要導出的別名 -keystore 指定keystore -file 指定導出的證書位置及證書名稱 -storepass 密碼
-file 參數指定導出到文件的文件名
-delete 刪除密鑰庫中某條目 keytool -delete -alias 指定需刪除的別 -keystore 指定keystore -storepass 密碼
-printcert 查看導出的證書信息 keytool -printcert -file yushan.crt
-keypasswd 修改密鑰庫中指定條目口令 keytool -keypasswd -alias 需修改的別名 -keypass 舊密碼 -new 新密碼 -storepass keystore密碼 -keystore sage
-storepasswd 修改keystore口令 keytool -storepasswd -keystore e:yushan.keystore(需修改口令的keystore) -storepass 123456(原始密碼) -new yushan(新密碼)
-import 將已簽名數字證書導入密鑰庫 keytool -import -alias 指定導入條目的別名 -keystore 指定keystore -file 需導入的證書
生成keyStore
RSA是一個既能用於數據加密也能用於數字簽名的演算法。
DSA(Digital Signature Algorithm,數字簽名演算法,用作數字簽名標準的一部分),它是另一種公開密鑰演算法,它不能用作加密,只用作數字簽名。DSA使用公開密鑰,為接受者驗證數據的完整性和數據發送者的身份。
提取證書:
通過keytool命令我們可以很輕鬆的提取證書.
證書包括主體信息,公鑰.
keytool -export -alias 別名 -keystore 文件名 -file 證書名稱
通過Java的KeyStore類getEntry() 或者getKey()來提取私鑰.
讀取keyStore文件:
char[] password = 「password」.toCharArray();
java.io.FileInputStream fis = new java.io.FileInputStream(「c:/server/server_keystore」);
// 從指定的輸入流中載入此 KeyStore
ks.load(fis, password);
//keystore 中的每一項都用「別名」字元串標識。
//使用指定保護參數獲取指定別名的 keystore Entry。
//KeyStore.PrivateKeyEntry 保存 PrivateKey 和相應證書鏈的 KeyStore 項。
方法1. KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(「keystore別名」, new KeyStore.PasswordProtection(password));
// 返回與給定別名相關聯的密鑰
方法2. PrivateKey key = (PrivateKey) ks.getKey(「ser」, password);
怎麼來驗證提取的私鑰是否正確呢?(因為公鑰私鑰必須成對出現,我們可以通過證書提取去公鑰,然後用公鑰加密,使用剛剛獲得的私鑰解密)
提取證書的方法:
keytool -export -alias 別名 -keystore 文件名 -file 證書名稱
//通過證書,獲取公鑰
CertificateFactory cf = CertificateFactory.getInstance(「X.509」);
FileInputStream in = new FileInputStream(「C:\server\server.cer」);
//生成一個證書對象並使用從輸入流 inStream 中讀取的數據對它進行初始化。
Certificate c = cf.generateCertificate(in);
PublicKey publicKey = c.getPublicKey();
//通過下面這段代碼提取的私鑰是否正確
String before = 「asdf」;
byte[] plainText = before.getBytes(「UTF-8」);
Cipher cipher = Cipher.getInstance(「RSA/ECB/PKCS1Padding」);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// 用公鑰進行加密,返回一個位元組流
byte[] cipherText = cipher.doFinal(plainText);
cipher.init(Cipher.DECRYPT_MODE, myPrivateKey);
// 用私鑰進行解密,返回一個位元組流
byte[] newPlainText = cipher.doFinal(cipherText);
SSL證書是HTTP明文協議升級HTTPS加密協議的重要渠道,是網路安全傳輸的加密到通道。關於更多SSL證書的資訊,請關注GDCA(數安時代)。GDCA致力於網路信息安全,已通過WebTrust 的國際認證,是全球可信任的證書籤發機構。GDCA專業技術團隊將根據用戶具體情況為其提供最優的產品選擇建議,並針對不同的應用或伺服器要求提供專業對應的HTTPS解決方案。
文章轉載:https://www.trustauth.cn/wiki/21756.html


※簡述數字簽名證書之數字時間戳
※虛擬貨幣:比特幣廣受全球不法分子的青睞
※一級域名與二級域名之間的區別
※史上最強網路安全大戰,勒索病毒WannaCry席捲全球
※SEO新手必備:SEO名詞定義匯總
TAG:數安時代GDCA |