Server:
創建本地證書:
keytool -genkey -alias testserver-keyalg RSA -keystore keystore
其中alias自己起一個別名,keystore為證書庫的文件路徑
還可以加上-keysize 1024、2048、4096等來指定公鑰的大小,由此導出的證書查看時可以看到公鑰的大小是與之一致的。keysize越大genkey時耗費時間越長。
會要求鍵入一個密碼,為這個證書庫的訪問密碼
會要求填寫一些信息,姓名、單位、地區之類
最后要求鍵入一個密碼,為這條證書別名的密碼
導出cert:
keytool -export -alias testserver-file testcert.cer -keystore keystore
這里的別名和文件名同上一步
Client:
直接導入cert:
Truststore文件中存儲的是作為client,信任那些server的證書。所以需要將server提供的證書導入進來(當然可以導入n個),client才能信任。
keytool -import -alias testserver-file testcert.cer -keystore truststore
導入時需要輸入密碼,該密碼應該是truststore文件的訪問密碼,密碼正確才能修改其信息。
提示是否信任該證書信息,確認。
查看證書信息:
keytool –list –v –keystore truststore
如果導入過多個,則可以看到多條entry
刪除某一個證書entry,通過指定別名來刪:
keytool -delete -alias testserver-keystore truststore
上述是自簽名的證書,證書鏈的長度只為1
真正商用時,需要找相關機構(例如verisign)認證通過才能成為有效的證書:
生成證書簽名請求:
keytool -certreq -keyalg RSA -alias testserver -file certreq.csr -keystore keystore
之后能夠收到一個證書文件,證書鏈信息包含了該機構的一些信息,然后再導入。
有兩種方法建立HTTPS連接,
一種是,在java中可以設置相關的4個系統參數,指向相關的keystore,truststore,一旦設置,在運行時就不可改變了。除非一定要使用多個不同的證書庫文件,否則可以把多個不同證書都導入到同一個證書庫里,這樣,設置系統參數為唯一的值也夠用,而且也比較簡單一些。
另一種是,自己繼承相關接口實現自己的證書管理器,這樣可以自定義相關行為,也可以load不同的證書庫。
如果不設置password,就認為不檢查文件完整性,也能通過。如果設置了password,但是不正確,則會遇到密碼錯誤的異常;如果server證書沒有導入到client得信任列表里,則會遇到找不到可信證書的異常。