密鑰:
我理解是公開金鑰+私密金鑰的統稱。
金鑰組:
公開金鑰(認證)和私密金鑰成對存在。
通訊雙方各持有自己的私密金鑰和對方的公開金鑰。自己的私密金鑰需密切保護,而公開金鑰是公開給對方的。在windows下,單獨存在的公開金鑰一般是尾碼為.cer的檔案
A用自己的私密金鑰對資料加密,發給B,B用A提供的公開金鑰解密。同理B用自己的私密金鑰對資料加密,發送給A後,A用B的公開金鑰解開。
公開金鑰的兩個用途:
1。驗證對方身份:防止其他人假冒對方發送資料給你。
2。解密。
私密金鑰的兩個用途:
1。表明自己身份:除非第三方有你私密金鑰,否則無法假冒你發送資料資料給對方。
2。加密。
jks(java key store):
java用的儲存體金鑰的容器。可以同時容納n個公開金鑰或私密金鑰,尾碼一般是.jks或者.keystore或.truststore等,千奇百怪。
不管什麼尾碼,它就是一個容器,各個公司或機構叫法不同而已。比如把只包含"受信任的公開金鑰"的容器存成.truststore檔案等。
用jdk\bin目錄下的keytool.exe對其進行查看,匯入,匯出,刪除,修改密碼等各種操作。
可以對jks容器加密碼,輸入正確才可以操作此容器中密鑰。
還有一個密碼的概念與上者不同,是jks中儲存著的私密金鑰的密碼,通常是絕密的。
pfx:
和jks功能相同但檔案格式不同,pfx是瀏覽器用的。
可以用一些工具程式把pfx轉化成jks格式供java程式使用(如銀行只提供了pfx,但是我們想用httpclient類比瀏覽器自動訪問時)。
據說IE匯出的pfx格式不標準,轉化jks時往往報錯,可以嘗試用Netscape Navigator匯入再匯出,然後再轉化。碰到過這樣的情況。
常見的幾種https系統的訪問
經https協議的資料經過加密傳輸,防止第三方監聽,冒充和篡改。
1.不需要使用者做任何操作,比如https://www.verisign.com/
這是因為此公開金鑰是合法的(公開金鑰是可信任的機構頒發,和實際網域名稱吻合,而且沒有到期)。用IE訪問時空白處點右鍵可以查看公開金鑰資訊。
2.https的頁面會彈出公開金鑰確認提示
公開金鑰不合法(不是可信任的機構頒發,和實際網域名稱不吻合,已到期),但使用者點“是”即表示忽略危險,繼續訪問。
3.需要往瀏覽器倒入一個檔案才可訪問的
一般是銀行線上交易等特別需要安全的場合,站方(銀行)需要驗證訪客身份(如要確認必須是登入的網銀商戶),需要在瀏覽器中匯入含有訪客私密金鑰的pfx檔案。
產生jks:
在銀行沒有提供jks檔案的情況下對帳,需要自己產生jks
對於1,2類https網站,如果java程式訪問此地址時在jre預設的信任庫中找不到對方認證的頒發機構,則會拋出安全方面的異常。
所以要將站方公開金鑰存進一個jks,並在環境變數中設定,表明信任此庫中的公開金鑰,才可以正常訪問。
我是用現成的make_jks的工具類在程式中讀取https://xxxx地址,程式自動抓取出銀行公開金鑰並存進一個jks檔案。
在瀏覽器中查看站方公開金鑰時,把公開金鑰匯出(一般是cer尾碼),然後用keytool.exe手工將此cer匯入一個jks或許也可以?沒試過。
以上1,2類https網站,僅僅是用到了公開金鑰的“驗證對方身份”功能。
對於第3種https網站,也可以找到現成的程式把pfx直接轉成jks。
既然動用了pfx,一般是把公開金鑰的兩個用途和私密金鑰的兩個用途都用起來。