2012年1月10日 星期二

在https下applet無法正常初始化


今天因為發生了在https下applet無法正常初始化的狀況,好不容易解決了
寫下文章記錄一下吧



狀況分析:
連到oracle的網站上測試 sample applet 都是正常的,但是自已的applet完全無法執行包含最基本的system.out.println
猜測一:
會不會是applet使用的憑證不合法導致?(在這裡的方向錯了,在打這篇心得時才發現)
行動:
原本的applet jar只用keytool做最簡單的加簽(但已經可以執行),所以上網找了比較完整的做法
請參考如下
http://daniex.info/using-openssl-keytool-build-sslconnection-between-c-java.html
http://daniex.info/generated-with-the-openssl-command-to-create-self-signed-certificates-and.html
結果:
失敗,執行後還是不行正常執行aaplet

猜測二:
applet加簽模式似乎沒有差別,那會不會是SSL連線使用憑證不合法導致?
行動:
把憑證加入信任的清單中,但是在WIN 7中有很多種信任清單,我只能每個都加入
結果:
失敗,執行後還是不行正常執行aaplet

猜測三:
不是os的信任清單,那會是java信任清單嗎?
行動:
一樣把憑證加入java的每種清單中,一開始一樣是敗失連連,
但是某一次調整時將JRE改回1.6版本,剛好可以正常執行,所以我想問題是找到了
再改回1.7時又失敗,於是我更新了1.7的版本,YA! 可以正常執行
結果:
成功!!!

結論,在jre留下的log中看到,在SSL連線時會檢查host的憑證,有問題的JRE版本在比對完所有憑證時他就會停下來,導致applet無法執行
底下為log部分內容
security: 正在從部署階段作業憑證儲存庫中載入憑證
security: 已從部署階段作業憑證儲存庫中載入憑證
security: 正在從 Internet Explorer ROOT 憑證儲存庫載入憑證
security: 已從 Internet Explorer ROOT 憑證儲存庫載入憑證
security: 正在檢查憑證是否在部署拒絕憑證儲存庫中
security: 正在檢查憑證是否在部署階段作業憑證儲存庫中
security: 正在檢查 SSL 憑證是否在部署永久憑證儲存庫中
security: 檢查憑證是否可使用 Root CA 憑證儲存庫中的憑證來驗證
security: 將被驗證的憑證: 
security: 正在將憑證與以下 Root CA 憑證比較: 
...比對比對...
...比對比對...
...比對比對...
security: 憑證經過 Internet Explorer ROOT 憑證驗證失敗
security: 無效的 HTTPS 伺服器憑證

沒有留言: