在瀏覽器中訪問https是件挺方便的事,與訪問http站點相比,也就是地址欄上多個“s”。但是,在java平台上訪問https,可就麻煩多了。Java虛擬機並不直接使用操作系統的key ring,而是有自己的security manager。與操作系統類似,jdk的security manager默認有一堆的根證書信任。如果你的https站點證書是花錢申請的,被這些根證書所信任,那使用java來訪問此https站點會非常方便。但假如,你的https證書是自己簽名的,就需要將證書導入至JDK的信任證書中,否則訪問時會報SSL錯誤。假如,你的webserice是基於https來進行訪問,而此站點證書是自簽名類型的,那么部署時一定要使用keytool進行證書導入,否則無法正常訪問。
JDK keystore存放路徑
默認在 $JAVA_HOME/jre/lib/security/cacerts 在我的Mountaion Lion中,存放路徑為:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts
keystore的默認密碼
“changeit”
有人說OS X中java的 Keystore密碼被更改成了: “changeme”。所以如果你用上面那個訪問失敗,可以試試這個。
keytool亂碼
keytool在OS X中經常顯示為亂碼,它在中文OS X中輸出GB2312編碼,所以要將terminal的默認編碼更改成GB2312或者中文(ECU)。
導入證書
-
首先,先通過瀏覽器將證書下載下來,點擊顯示證書詳細的時候,直接將圖標拖動到桌面上即可。
-
通過keytool命令來導入證書,注意導入時需要管理員權限,所以命令前面要加sudo。不知道這個在win7系統上是不是也要如此。
-
最后通過keytool list顯示信任的證書,通過MD5值驗證一下證書是否導入成功。
最后: KeyTool命令詳解
又及:
證書的cn(常用名稱)需要和訪問地址相一致,不然,仍然可能報錯。所以,往往需要根據cn名稱在hosts文件中為訪問的ip地址添加域名解析。以gmail的證書為例:
再及:
XMLRpc上介紹了一種方法,通過自定義一個TrustManager來對所有的站點都進行信任來實現調用自簽名的https webService。我試了半天不知為何沒有成功。