因為專題要變成網站,而在這方面又出了點問題,因此到處蒐集了一些資料。
以下彙整 ptt java板 精華區 z-5-2-4 、 z-5-2-9 和我自己的實作經驗,有興趣可以看看吧。
Java(含Applet)的安全機制(Security Manager)
Browser 中的 applet 其實就是 Browser 把 class(jar) download 下來後,再啟動 java 去執行 download 下來的程式,但因為從網路上 download 程式碼來執行是很危險的事,所以 java 一開始就把這一部分的安全設計得很嚴密。java在執行時有兩種模式,一種是有啟動 Secuirty Manager,另一種是沒有啟動 Secuirty Manager 的,一般寫程式在自己電腦上執行是沒有啟動 Secuirty Manager 的,這個情況下不論程式寫什麼,java 都會照著執行 (像是把自拍照傳給別人之類的),因為程式是你寫的,不需要還讓你綁手綁腳的。但其實如果你怕一時手滑把自拍照傳出去,或是你用到其他人寫的 library 而你並不信任他,那其實還是可以把 security manager 給打開(加上 vm 參數 -Djava.security.manager),你就會發現你就像被關在 applet 裡一樣失去辦事的能力了。所以到這裡你就可以了解 applet 會有這麼多限制並不是因為他是 applet,而是因為 Browser在執行他的時候是開著 security manager 的。
至於打開 "SM" 的情況下你到底能做什麼? java 大發慈悲讓你可以使用 cpu,可以配置記憶體,可以讀一些和 java 有關的環境變數,如果是 applet 的話畫畫圖,連回 server 抓資料,大概就這些了,詳細情況去 trace 一下 jre 的source code,當你發現在做某些動作時他有去問一下 Security Manager 老大時,那大概你就不能做了。雖然說 Security Manager 是老大,但他終究還是聽你的話,Security Manager 是根據 <jre>\lib\security\java.policy 裡的設定來做限制的。有慧根的好奇寶寶或許會問,如果在 "SM" 時不能讀寫檔案,那 jre 怎麼去 load 檔案系統中的 jar檔呢?答案是 "SM" 是看人欺負的,jre 本身和 "SM" 是一伙的當然不會被限制,而放在 <jre>\lib\ext 裡的程式也都是和 SM 同伙的,而你寫的程式就會被欺負了。所以你可以把你的程式也放到 <jre>\lib\ext 裡,這樣你也可以和 "SM" 做好朋友。
以上就是 java security 最基本的架構。好奇寶寶或許又要問,為什麼要弄得這麼複雜呢?其實就是 java 從一出身就背負著光復網路執行環境的大任,所以必需非常重視安全性這一塊。除了像是 applet 這種情況外,像是 application server也常會把 "SM" 打開,不然我寫一個 servlet 把所有其他人的 service 全搞爛這還得了。
接下來再談一下 Browser 上 run applet 的問題。我說既然因為有 "SM" 的關係而失去辦事的能力,那為什麼把 code sign 一下就又可以了?原因是因為要每個使用者都去和 "SM" 談一下太麻煩了,所以 java 在 browser 的 plug-in 執行 applet 而想辦事被拒絕後,會看一下要執行的這個 code 有沒有被 sign 過,如果有 sign 過,就問一下真正的老大是不是要讓這個傢伙辦事,也把要辦事的這個人顯示給你看(也就是那個 pop-up 視窗了)。為什麼有這個行為呢?是因為 code 被 sign 過表示確定是個有名有姓的人產生這個程式,而且做出來後沒有被別人篡改過,這樣這個程式還算有被信任的資格,至於到要底不要讓他辦事還是要問你才行。所以讓大家知道,"SM"的存在是善意的,是為了建立一個安全的執行環境。
增加Applet的權限
由於JApplet預設就有以下的限制:
1. Applet無法對本地電腦做任何的檔案存取
2. Applet無法喚起在本地電腦的任何其他程式
3. Applet除了與下載包含Applet之HTML網頁的電腦通訊外,不會與其他電腦通訊。
突破以上限制的流程如下:
1. 將此 applet 打包成 jar 檔。
2. 使用 keytool 產生 key。
3. 使用 jarsigner , sign jar檔,這時要用到剛所產生的 key。
4. 寫一下 html tag 即可。
詳述突破流程:
1. 詳情可以參閱此網頁:http://ken814.blogspot.com/2007/10/java-jar.html。
2. 指令為:keytool -genkey [-alias alias-name -keystore keystore-name]
genkey後面那一串不輸入沒關係,不輸入的話 alias-name 預設值就是 mykey。keystore的檔名就會是 .keystore,而在 WinVista 的存檔路徑:C:\User\XXX\.keystore。
此時會問你六個問題,實際截圖如下:
3. 指令為:jarsigner -keystore keystore-name -storepass keystore-password -keypass key-password jar-file alias-name
看樣很複雜,不如直接使用這個比較好:jarsigner XXX.jar alias-name
注意:預設值是這組KEY的有效日期是6個月,而實際截圖如下(Project.jar是我的jar檔名):
4. 比如說我的 applet 是 SampleApplet.class ,包在 test.jar 檔裡面
<applet code="SampleApplet.class"
archive="test.jar"
width=400 height=400>
</applet>
完成以上步驟,使用者只要連入那個網頁都會跳出一個視窗問你要不要信任這個網頁內容,OK的話就應該沒問題了。
留言列表