一. applet中的數字簽名 1
1 前言 2
2 計算機環境 2
3 客戶端需求 2
4 編譯 2
5 打包 2
6 調用applet的HTML頁面 2
7 準備簽名代碼 3
8 簽名代碼 4
9 運行Applet 4
二. 用jbuilder2005對applet進行數字簽名 1
I. 數字證書的生成 1
II. 打包 2
III. 指定資源文件 3
IV. 簽名Applet的目標JAR文件 4
V. 引用Applet包文件 6
三. 解決applet中的網絡訪問問題
1 前言
我們知道Java Applet程序在運行的時候受到安全限制,例如不能夠訪問本地文件系統,不能夠隨意訪問網絡.,不能訪問數據庫。下面將介紹如何對代碼做數字簽名,讓客戶在運行時選擇是否信任你的簽名,使開發的程序具有更多的權限。在這里不打算購買證書。
2 計算機環境
Windows2000 professional sp3
SUN JDK1.4.0
IE6.0
JAVA_HOME、PATH、CLASSPATH等環境變量均已設置
3 客戶端需求
客戶端瀏覽器需要安裝Java插件,這里的Java插件是安裝JDK時一起安裝的。如果客戶端不需要做Java開發,可以去下載SUN的網站下載JRE到客戶端安裝。
4 編譯
在與softphone目錄的父目錄編譯這個Applet
javac softphone *.java
5 打包
jar -cvf softPhone.jar softphone
用jbuilder開發工具自帶的打包功能
6 調用applet的HTML頁面
<applet
archive="softPhone.jar"
codebase = "."
code = "softphone.gui.class"
name = "TestApplet"
width = "660"
height = "110"
hspace = "0"
vspace = "0"
align = "middle"
>
</applet>
7 準備簽名代碼
首先用keytool命令產生用來簽名的key。下面這個命令產生一個叫"mykey"的key,它存儲在我們新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下來它會問一些問題包括keystore的密碼,key的密碼等,如下所示:
輸入keystore密碼: storepass
您的名字與姓氏是什么?
[Unknown]: liu
您的組織單位名稱是什么?
[Unknown]: XX公司
您的組織名稱是什么?
[Unknown]: XX公司
您所在的城市或區域名稱是什么?
[Unknown]: aa
您所在的州或省份名稱是什么?
[Unknown]: sh
該單位的兩字母國家代碼是什么
[Unknown]: CN
CN=AYellow, OU=我的組織單位, O=我的組織, L=北京, ST=北京, C=CN 正確嗎?
[否]: Y
輸入<mykey>的主密碼
(如果和 keystore 密碼相同,按回車): keypass
完成后會在當前目錄下生成一個叫mystore的文件,這個文件包含了我們的key。
8 簽名代碼
用jarsigner命令簽名我們的代碼test.jar(需要輸入keystore和key的密碼):
jarsigner -keystore mystore test.jar mykey
Enter Passphrase for keystore: storepass
Enter key password for mykey: keypass
9 運行Applet
運行Applet,在Applet加載的時候會出現一個對話框,說該Applet由不可信任的發行者簽名并宣稱代碼是安全的,是不是要對Applet授權。選擇"授權于會話",就可以進行軟電話操作.
二. 用jbuilder2005對applet進行數字簽名 1
I. 數字證書的生成
在JBuilder的Applet打包向導中僅需要一個數字證書,向導會為最終的JAR包生成消息摘要、消息驗證碼并簽名。通過JDK自帶的Keytool工具可以為生成一個數據證書,這個工具位于JDK的bin目錄下。
打開DOS命名窗口,定位到JBuilder 2005下自帶的JDK的bin目錄下,執行下面的Keytool命名生成一張自己的證書:
C:\Borland\JBuilder2005\jdk1.4\bin>keytool -genkey -alias chenxhCA - keyalg RSA -keystore superCALib -validity 3650
命令窗口將要求你輸入一些個人信息
這里我們使用keytool工具生成了一個名為chenxhCA的證書,它存放到superCALib證書庫中,有效期為10年,使用的加密算法上RSA。證書庫superCALib的訪問密碼是123456,而chenxhCA證書條目的訪問密碼是123123。在輸入作為發送者身份標識的信息后就會在當前目標,即C:\Borland\JBuilder2005\jdk1.4\bin下生成一個名為superCALib的證書庫文件。
keytool參數較多,使用也比較復雜,詳細使用說明,請參見Sun網站的幫助文檔:
一般情況下你還需要將該證書發給權威的CA簽名,這個證書才會被視為合法的證書,當然你也可以模擬創建一個CA證書,用這個CA證書為我們將用于簽發Applet的chenxhCA證書簽名,為了簡單起見我們忽略這一步。
II. 打包
現在已經萬事俱備了,我們可以開始利用JBuilder的打包向導將Applet所以文件打包并簽名的過程。
1) File->New...->Archive,在Archive頁中雙擊Applet JAR圖標啟動Applet打包向導。
2) 在向導第1步中指定Applet JAR的名字和保存到目標文件,
為了加速網絡下載速度,我們勾選上Compress the contents of the archive選項,壓縮JAR文件,減小文件的體積。Always create archive when building the project選項使用每次編輯工程時都重新創建Applet JAR包。點擊Next到下一步。
III. 指定資源文件
指定JAR文件中所需包含的資源文件
由于TypeTrainApplet程序引用了3張圖片,所以JAR文件除包含TypeTrainApplet.class程序文件外,還需要將用于按鈕圖標的文件選擇進來
按Next到下一步。
注意:
當你指定game.TypeTrainApplet.class,start.gif,pause.gif,stop.gif,hit.wav時,打成的Applet JAR包將不能正確運行,那些和TypeTrainApplet類位于同一程序文件的事件監聽器類將被排除在外,所以需要通過game/*.*來打包。
IV. 簽名Applet的目標JAR文件
由于向導第3~6步,我們不需要作特別的設置,所以一直按Next到第7步。
在這一步里,我們用上一小節中生成的數字證書簽名Applet的目標JAR文件
稤igitally sign this archive選項在默認的情況下是未選中的,首先勾選該選項
點擊稫eystore后的…按鈕,選擇我們剛才在C:\Borland\JBuilder2005\jdk1.4\bin目錄下所生成的superCALib證書庫文件。
在稫eystore password中輸入123456,即證書庫的密碼。
點擊稟lias后的…按鈕,由于我們在superCALib證書庫中僅有一個chenxhca證書,所以在彈出的Select Alias對話框的Available Alias列表中僅有一個chenxhca選項,選擇chenxhca證書。
在稟lias password中輸入123123,即chenxhca證書的私鑰密碼。
在稴tore type中輸入JKS,由于Keytool工具的默認證書庫類型是JKS,所以superCALib的類型為JKS。
在設置完以后的信息后,按Finish結束向導,在工程窗格的資源樹中將出現一個TypeTrainJAR的節點。右擊這個節點,在彈出的菜單中選擇Rebuild,JBuilder將創建Applet的JAR包,并用chenxhca證書簽名。
Rebuild完成后,工程窗格的Applet JAR節點就可以展開了,展開這個節點,我們發現目標JAR文件中除了資源文件以外,在META-INF文件夾下還有3個文件
META-INF文件夾下的3個文件是和數字簽名有關的文件,說明如下:
MANIFEST.MF:這個 manifest 文件定義了與擴展和包相關的數據。
MONITOR.SF:這是 JAR 文件的簽名文件,文件名標識了簽名者。
MONITOR.DSA:與簽名文件相關聯的簽名程序塊文件,它存儲了用于簽名 JAR 文件的公共簽名。
V. 引用Applet包文件
我們現在來更改TypeTrainApplet.html中<applet>的屬性使其通過JAR來引用Applet程序。這個過程很簡要,打開TypeTrainApplet.html文件,切換到Source視圖頁中,將光標定位在<applet>標簽中。窗口右邊出現<applet>標簽的屬性輸入編輯器,在archive中輸入game.JAR,按回車
JBuilder為<applet>標簽添加archive的屬性。由于game.JAR文件位于工程根目錄下,而TypeTrainApplet.html文件位于工程目錄的classes子文件夾下,所以需要將TypeTrainApplet.html拷貝到工程根目錄下,這樣archiver="game.JAR "的屬性聲明才是正確的,因為在尋找程序資源時,是以TypeTrainApplet.html所在目錄為相對路徑的。
保存后,到工程目錄下雙擊TypeTrainApplet.html文件,IE檢測到網頁中包含了經過簽名的Applet程序,彈出一個安全警告的對話框
由于我們的證書沒有經過權威機構的簽名認證,所以對話框提示"此安全證書是由不可信的公司簽發的"信息。需要指出的是游覽器的JRE版本不同,彈出的警告對話框并不相同,上圖是JRE版本為1.5.0時的警告對話框。
可以通過點擊"更多詳細信息"按鈕查看證書的信息
點選"簽發人"項,將可以看到證書執有者的個人信息。關閉這個對話框,回到 "警告-安全"對話框中,點擊"是"接受這個簽名的Applet。IE就對這個Applet開放了安全權限,不再受沙盒模型的限制了。
彈出因網絡斷開,或啟用防火墻而出現的對話框.
通過加強數字簽名解決。
解決問題的方法:
在C:\soft\jdk\jre\lib\security\java.policy中加入
grant {
permission java.net.SocketPermission "*", "connect,accept,resolve";
permission java.net.SocketPermission "*:1024-65535", "listen,accept,connect";
};
</script>