Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐轉(zhuǎn)_第1頁
Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐轉(zhuǎn)_第2頁
Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐轉(zhuǎn)_第3頁
Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐轉(zhuǎn)_第4頁
Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐轉(zhuǎn)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.Java平安通信、數(shù)字證書及應(yīng)用實(shí)踐 轉(zhuǎn)摘要:在本文中,我用詳細(xì)的語言和大量的圖片及完好的程序源碼向你展示了在JAVA中如何實(shí)現(xiàn)通過消息摘要、消息驗(yàn)證碼到達(dá)平安通信、以及用Java的工具生成數(shù)字證書,和用程序給數(shù)字證書簽名、以及用簽名后的數(shù)學(xué)證書簽名applet打破applet的訪問權(quán)限的過程,給出了全部例子的詳細(xì)代碼。通過本文中你可以學(xué)到以下知識:程序間如何平安通信什么是及如何生成消息摘要什么是及如何生成消息驗(yàn)證碼如何使用Java工具生成和維護(hù)數(shù)字證書庫如何用程序給數(shù)字證書驗(yàn)證簽名如何利用數(shù)字證書給applet簽名打破applet的訪問權(quán)限關(guān)鍵字:消息摘要、消息驗(yàn)證碼、指紋、加密、平安、J

2、ava、數(shù)字簽名、applet、數(shù)字證書一、根底知識計(jì)算機(jī)平安通信過程中,常使用消息摘要和消息驗(yàn)證碼來保證傳輸?shù)臄?shù)據(jù)未曾被第三方修改。消息摘要是對原始數(shù)據(jù)按照一定算法進(jìn)展計(jì)算得到的結(jié)果,它主要檢測原始數(shù)據(jù)是否被修改正。消息摘要與加密不同,加密是對原始數(shù)據(jù)進(jìn)展變換,可以從變換后的數(shù)據(jù)中獲得原始數(shù)據(jù),而消息摘要是從原始數(shù)據(jù)中獲得一部分信息,它比原始數(shù)據(jù)少得多,因此消息摘要可以看作是原始數(shù)據(jù)的指紋。例:下面一段程序計(jì)算一段字符串的消息摘要package com.messagedigest;import java.security.*;public class DigestPasspublic sta

3、tic void mainString argsthrows ExceptionString str="Hello,I sent to you 80 yuan.";MessageDigest md=MessageDigest.getInstance"MD5";/常用的有MD5,SHA算法等md.updatestr.getBytes"UTF-8";/傳入原始字串byte re=md.digest;/計(jì)算消息摘要放入byte數(shù)組中/下面把消息摘要轉(zhuǎn)換為字符串String result="";forint i=0;i&l

4、t;re.length;i+result+=Integer.toHexString0x 000000ff&rei|0xffffff00.substring6;System.out.printlnresult;當(dāng)我們有時(shí)需要對一個(gè)文件加密時(shí),以上方式不再適用。又例:下面一段程序計(jì)算從輸入出流中計(jì)算消息摘要。package com.messagedigest;import java.io.*;import java.security.*;public class DigestInputpublic static void mainString argsthrows ExceptionStr

5、ing fileName="test.txt";MessageDigest md=MessageDigest.getInstance"MD5";FileInputStream fin=new FileInputStreamfileName;DigestInputStream din=new DigestInputStreamfin,md;/構(gòu)造輸入流/DigestOutputStream dout=new DigestOutputStreamfout,md;/使用輸入出流可以自己控制何時(shí)開場和關(guān)閉計(jì)算摘要/也可以不控制,將全過程計(jì)算/初始時(shí)是從開場即開場

6、計(jì)算,如我們可以開場時(shí)關(guān)閉,然后從某一部分開場,如下:/din.onfalse;int b;whileb=din.read!=-1/做一些對文件的處理/ifb='$'din.ontrue;/當(dāng)遇到文件中的符號$時(shí)才開場計(jì)算byte re=md.digest;/獲得消息摘要/下面把消息摘要轉(zhuǎn)換為字符串String result="";forint i=0;i<re.length;i+result+=Integer.toHexString0x 000000ff&rei|0xffffff00.substring6;System.out.println

7、result;當(dāng)A和B通信時(shí),A將數(shù)據(jù)傳給B時(shí),同時(shí)也將數(shù)據(jù)的消息摘要傳給B,B收到后可以用該消息摘要驗(yàn)證A傳的消息是否正確。這時(shí)會(huì)產(chǎn)生問題,即假設(shè)傳遞過程中別人修改了數(shù)據(jù)時(shí),同時(shí)也修改了消息摘要。B就無法確認(rèn)數(shù)據(jù)是否正確。消息驗(yàn)證碼可以解決這一問題。使用消息驗(yàn)證碼的前提是A和B雙方有一個(gè)共同的密鑰,這樣A可以將數(shù)據(jù)計(jì)算出來的消息摘要加密后發(fā)給B,以防止消息摘要被改。由于使用了共同的密鑰,所以稱為"驗(yàn)證碼"。例、下面的程序即可利用共同的密鑰來計(jì)算消息摘要的驗(yàn)證碼package com.mac;import java.io.*;import java.security.*;i

8、mport javax.crypto.*;import javax.crypto.spec.*;public class MyMacpublic static void mainString argsthrows Exception/這是一個(gè)消息摘要串String str="TestString";/共同的密鑰編碼,這個(gè)可以通過其它算法計(jì)算出來byte kb=11,105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,67,-88,59,-71,55,-125,104,42;/獲取共同的密鑰SecretKeySpec

9、k=new SecretKeySpeckb,"HMACSHA1";/獲取Mac對象Mac m=Mac.getInstance"HmacMD5";m.initk;m.updatestr.getBytes"UTF-8";byte re=m.doFinal;/生成消息碼/下面把消息碼轉(zhuǎn)換為字符串String result="";forint i=0;i<re.length;i+result+=Integer.toHexString0x 000000ff&rei|0xffffff00.substring6;S

10、ystem.out.printlnresult;使用以上兩種技術(shù)可以保證數(shù)據(jù)沒有經(jīng)過改變,但接收者還無法確定數(shù)據(jù)是否確實(shí)是某個(gè)人發(fā)來的。盡管消息碼可以確定數(shù)據(jù)是某個(gè)有同樣密鑰的人發(fā)來的,但這要求雙方具有共享的密鑰,假設(shè)有一組用戶共享,我們就無法確定數(shù)據(jù)的來源了。數(shù)字簽名可以解決這一問題。數(shù)字簽名利用非對稱加密技術(shù),發(fā)送者使用私鑰加密數(shù)據(jù)產(chǎn)生的消息摘要簽名,接收者使用發(fā)送者的公鑰解密消息摘要以驗(yàn)證簽名是否是某個(gè)人的。由于私鑰只有加密者才有,因此假設(shè)接收者用某個(gè)公鑰解密了某個(gè)消息摘要,就可以確定這段消息摘要必然是對應(yīng)的私鑰持有者發(fā)來的。使用數(shù)字簽名的前提是接收數(shù)據(jù)者可以確信驗(yàn)證簽名時(shí)用發(fā)送者的私鑰

11、加密消息摘要所用的公鑰確實(shí)是某個(gè)人的因?yàn)橛锌赡苡腥思俑婀€。數(shù)字證書可以解決這個(gè)問題。數(shù)字證書含有兩部分?jǐn)?shù)據(jù):一部分是對應(yīng)主體單位或個(gè)人的信息,另一部分是這個(gè)主體所對應(yīng)的公鑰。即數(shù)字證書保存了主體和它的公鑰的一一對應(yīng)關(guān)系。同樣,數(shù)字證書也有可能被假造,如何斷定數(shù)字證書的內(nèi)容的真實(shí)性呢?所以,有效的數(shù)字證書必須經(jīng)過權(quán)威CA的簽名,即權(quán)威CA驗(yàn)證數(shù)字證書的內(nèi)容的真實(shí)性,然后再在數(shù)字證書上使用自己的私鑰簽名相當(dāng)于在證書加章確認(rèn)。這樣,當(dāng)用戶收到這樣的數(shù)字證書后,會(huì)用相應(yīng)的權(quán)威CA的公鑰驗(yàn)證該證書的簽名因?yàn)闄?quán)威的CA的公鑰在操作系統(tǒng)中己經(jīng)安裝。根據(jù)非對稱加密的原理,假設(shè)該證書不是權(quán)威CA簽名的,將不能

12、通過驗(yàn)證,即該證書是不可靠的。假設(shè)通過驗(yàn)證,即可證明此證書含的信息發(fā)信人的公鑰和信息是無誤的。于是可以信任該證書,便可以通過該證書內(nèi)含的公鑰來確認(rèn)數(shù)據(jù)確實(shí)是發(fā)送者發(fā)來的。于是,雙方通信時(shí),A把數(shù)據(jù)的消息摘要用自己的私鑰加密即簽名,然后把自己的數(shù)字證書和數(shù)據(jù)及簽名后的消息摘要一起發(fā)送給B,B處查看A的數(shù)字證書,假設(shè)A的數(shù)字證書是經(jīng)過權(quán)威CA驗(yàn)證可靠的,便信任A,便可使用A的數(shù)字證書中附帶的A的公鑰解密消息摘要這一過程同時(shí)確認(rèn)了發(fā)送數(shù)據(jù)的人又可以解密消息摘要,然后通過解密后的消息摘要驗(yàn)證數(shù)據(jù)是否正確無誤沒被修改。利用這一原理,我們可以打破java的applet小程序在閱讀器中的權(quán)限,由于默認(rèn)的ap

13、plet權(quán)限控制不允許它訪問操作系統(tǒng)級的一切。于是我們可以用我們數(shù)字證書來給applet簽名,然后客戶端收到該applet時(shí),系統(tǒng)會(huì)自動(dòng)查看給該applet簽名的數(shù)字證書并提供給終端用戶斷定是否信認(rèn)該數(shù)字證書,假設(shè)用戶信認(rèn),那么該applet便有了訪問系統(tǒng)的權(quán)限。二、Java中的數(shù)字證書的生成及維護(hù)方法Java中的keytool.exe可以用來創(chuàng)立數(shù)字證書,所有的數(shù)字證書是以一條一條采用別名區(qū)別的形式存入證書庫的中,證書庫中的一條證書包含該條證書的私鑰,公鑰和對應(yīng)的數(shù)字證書的信息。證書庫中的一條證書可以導(dǎo)出數(shù)字證書文件,數(shù)字證書文件只包括主體信息和對應(yīng)的公鑰。每一個(gè)證書庫是一個(gè)文件組成,它有訪

14、問密碼,在首次創(chuàng)立時(shí),它會(huì)自動(dòng)生成證書庫,并要求指定訪問證書庫的密碼。在創(chuàng)立證書的的時(shí)候,需要填寫證書的一些信息和證書對應(yīng)的私鑰密碼。這些信息包括CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它們的意思是:CNCommon Name名字與姓氏OUOrganization Unit組織單位名稱OOrganization組織名稱LLocality城市或區(qū)域名稱STState州或省份名稱CCountry國家名稱可以采用交互式讓工具提示輸入以上信息,也可以采用參數(shù)-dname"CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"來自動(dòng)創(chuàng)立。1、例如

15、如下所示一句采用交互式創(chuàng)立一個(gè)證書,指定證書庫為abnerCALib,創(chuàng)立別名為abnerCA的一條證書,它指定用RSA算法生成,且指定密鑰長度為1024,證書有效期為3650天:C:j2sdk1.4.1_01mykeystore>keytool-genkey-alias abnerCA-keyalg RSA-keysize 1024-keystore abnerCALib-validity 3650如以以下圖所示:上圖中最后一步,我們輸入的是CN,代表中國的縮寫,也可以直接輸入"中國"兩個(gè)字。2、證書的操作方法證書的顯示如:keytool list keystore

16、 abnerCALib將顯示abnerCALib證書庫的的所有證書列表:如以以下圖示:又如:keytool-list-alias abnerCA-keystore abnerCALib將顯示abnerCALib證書庫中別名為abnerCA的證書的信息。如以以下圖所示:又如:keytool-list-v-alias abnerCA-keystore abnerCALib將顯示證書的詳細(xì)信息-v參數(shù)如以以下圖所示:將證書導(dǎo)出到證書文件如:keytool-export-alias abnerCA-file abnerCA.cer-keystore abnerCALib將把證書庫abnerCALib中

17、的別名為abnerCA的證書導(dǎo)出到abnerCA.cer證書文件中,它包含證書主體的信息及證書的公鑰,不包括私鑰,可以公開,如以以下圖所示:上面導(dǎo)出的證書文件是以二進(jìn)制編碼文件,無法用文本編輯器正確顯示,因此不利用公布證書,可以加上-rfc參數(shù)以一種可打印的編者編碼輸出。如:keytool-export-alias abnerCA-file abnerCA.cer-keystore abnerCALib-storepass 100200 rfc這個(gè)命令在命令行中指定了證書庫的訪問密碼,同時(shí)指定以可查看編碼的方式輸出。3、通過證書文件查看證書的信息通過命令:keytool printcert f

18、ile abnerCA.cer可以查看證書文件的信息。也可以在windows中雙擊產(chǎn)生的證書文件直接查看。證書條目的刪除keytool的命令行參數(shù)-delete可以刪除密鑰庫中的條目,如:keytool-delete-alias abnerCA-keystore abnerCALib這條命令將abnerCALib庫中的abnerCA這一條證書刪除了。證書條目口令的修改如:keytool keypasswd alias abnerCA keystore abnerCALib可以以交互的方式修改abnerCALib證書庫中的條目為abnerCA的證書。Keytool keypasswd alias

19、 abnerCA keypass 123456 new 200100 storepass 1002 00 keystore abnerCALib這一行命令以非交互式的方式修改庫中別名為abnerCA的證書的密碼為新密碼123456,行中的200100是指該條證書的原密碼,1002 00是指證書庫的密碼。三、數(shù)字證書的簽發(fā)簽名我們在上面創(chuàng)立好了數(shù)字證書,但這些數(shù)字證書還沒有經(jīng)過權(quán)威CA的證實(shí)即簽名。一般情況下,我們需要將這些證書發(fā)送給權(quán)威的CA,并申請其簽名以確認(rèn)數(shù)字證書讓客戶信任。下面我們將模擬自己是一個(gè)權(quán)威的數(shù)字證書認(rèn)證機(jī)構(gòu)CA,這個(gè)機(jī)構(gòu)將采用自己的私鑰來簽發(fā)其它的證書。這個(gè)簽發(fā)過程是這樣的

20、:我們自己是CA,我們自己有一個(gè)自簽的數(shù)字證書存入數(shù)字證書庫中。在數(shù)字證書庫中的這個(gè)我們的CA數(shù)字證書,它含有私鑰,公鑰和我們這個(gè)CA的主體信息。下面這一個(gè)指令可以創(chuàng)立一個(gè)CA的自簽的數(shù)字證書:keytool genkey dname"CN=美森系統(tǒng)軟件,OU=美森系統(tǒng)軟件,O=美森系統(tǒng)軟件,L=成都市,ST=四川省,C=中國" alias MissionCA keyalg RSA keysize 1024 keystore abnerCALib keypass 200100 storepass 100200 validity 3650上面,我們在abnerCALib這個(gè)數(shù)

21、字證書庫中創(chuàng)立了一個(gè)別名為:missionCA、有效期為3650天、算法為RSA且密鑰長度為1024的數(shù)字證書,這條證書的私鑰密碼為:200100,證書庫的訪問密碼為:100200。這條別名為missionCA的證書代表我們自己的權(quán)威CA即:美森系統(tǒng)軟件這個(gè)權(quán)威CA。以后我們將用這個(gè)證書來簽名其它的數(shù)字證書。如今我要給自己申請一個(gè)數(shù)字證書,我可以這么做:先在數(shù)字證書庫中創(chuàng)立一條證書:keytool genkey dname"CN=柴政,OU=美森系統(tǒng)軟件,O=美森系統(tǒng)軟件,L=成都市,ST=四川省,C=中國" alias abnerCA keyalg RSA keysize

22、 1024 keystore abnerCALib keypass 200100 storepass 100200 validity 3650這樣創(chuàng)立了一個(gè)別名為abnerCA的數(shù)字證書,我們可以將它導(dǎo)出為cer文件見前。接著,我們可以用上一步生成的CA的自簽證書來簽名我這個(gè)數(shù)字證書了。CA簽名數(shù)字證書的過程需用以下程序來進(jìn)展,這個(gè)程序是自解釋的:package com.security;import java.io.*;import java.security.*;import java.security.cert.*;import java.util.*;import java.math.

23、*;import sun.security.x509.*;public class SignCertpublic static void mainString argsthrows Exceptionchar storepass="100200".toCharArray;/存放CA證書和被簽證書的證書庫的訪問密碼char cakeypass="200100".toCharArray;/CA數(shù)字證書條目的訪問密碼String alias="missionCA";/CA證書在證書庫中的別名,這個(gè)CA的證書用來簽名其它的證書String n

24、ame="abnerCALib";/存放CA證書和被簽證書的證書庫的名字String newLib="SignedLib";/新證書庫的名字,假設(shè)需要將簽名后的證書放入新庫,這是新庫的名字char newLibPass="100200".toCharArray;/設(shè)置新庫的訪問密碼String cerFileName="abnerCA.cer";/被簽證書的證書文件名String aliasName="abnerCA";/被簽證書在證書庫中的alias別名char namePass="

25、200100".toCharArray;/被簽證書的條目在證書庫的私鑰密碼int n=3;/被簽證書的有效期,以年為單位,以當(dāng)前時(shí)間開場計(jì)算int sn=200406001;/序列號可自己定義,這里定義的意義為2004年6月簽發(fā),是本年度CA簽發(fā)的第多少個(gè)以001計(jì)算,要求唯一String afteraliasName="abnerCA_Signed";/簽名后新產(chǎn)生的被簽過名的證書在庫中的別名char afterNewPass="200100".toCharArray;/簽名后新產(chǎn)生的被簽過名的證書在庫的條目的私鑰的密碼/裝載證書庫FileI

26、nputStream in=new FileInputStreamname;KeyStore ks=KeyStore.getInstance"JKS";/JKS為證書庫的類型ks.loadin,storepass;/從證書庫中讀出簽發(fā)者CA的證書java.security.cert.Certificate cl=ks.getCertificatealias;/讀出一個(gè)CA證書,這里的l是字母l不是數(shù)據(jù)字1 PrivateKey privateKey=PrivateKeyks.getKeyalias,cakeypass;/根據(jù)別名和證書密碼讀出CA證書的私鑰in.close;

27、/從證書庫中讀出的簽發(fā)者CA的證書中提取簽發(fā)者的信息byte encodl=cl.getEncoded;/提取證書的編碼,這里是字母l不是數(shù)據(jù)字1 X509CertImpl cimpl=new X509CertImplencodl;/這里是字母l不是數(shù)據(jù)字1,根據(jù)證書的編碼創(chuàng)立X509CertImpl類型的對象/根據(jù)上面的對象獲得X509CertInfo類型的對象,該對象封裝了證書的全部內(nèi)容。X509CertInfo cinfo_first=X509CertInfocimpl.getX509CertImpl.NAME+"."+X509CertImpl.INFO;/然后獲得X

28、500Name類型的簽發(fā)者信息X500Name issuer=X500Namecinfo_first.getX509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME;/獲取待簽發(fā)的證書,即獲取被簽發(fā)者的證書/可從密鑰庫中獲取,也可從導(dǎo)出的證書文件中獲取,這里給出兩種方式/方式一、采用從導(dǎo)出的cer文件中獲取start/end方式一/方式二、從證書庫中讀出被簽的證書start/java.security.cert.Certificate c3=ks.getCertificatealiasName;/從證書庫中讀出被簽證書,然

29、后生成新的證書byte encod3=c3.getEncoded;X509CertImpl cimp3=new X509CertImplencod3;X509CertInfo cinfo_second=X509CertInfocimp3.getX509CertImpl.NAME+"."+X509CertImpl.INFO;/end方式二/設(shè)置新證書的有效期,使之為當(dāng)前向后n年有效,新證書的/截止日期不能超過CA證書的有效日期Date beginDate=new Date;Calendar cal=Calendar.getInstance;cal.setTimebeginDa

30、te;cal.addcal.YEAR,n;Date endDate=cal.getTime;CertificateValidity cv=new CertificateValiditybeginDate,endDate;cinfo_second.setX509CertInfo.VALIDITY,cv;/設(shè)置新證書的序列號CertificateSerialNumber csn=new CertificateSerialNumbersn;cinfo_second.setX509CertInfo.SERIAL_NUMBER,csn;/設(shè)置新證書的簽發(fā)者cinfo_second.setX509Cert

31、Info.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer;/新的簽發(fā)者是CA的證書中讀出來的/設(shè)置新證書的算法,指定CA簽名該證書所使用的算法為md5WithRSA AlgorithmId algorithm=new AlgorithmIdAlgorithmId.md5WithRSAEncryption_oid;cinfo_second.setCertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm;/創(chuàng)立新的簽名后

32、的證書X509CertImpl newcert=new X509CertImplcinfo_second;/簽名,使用CA證書的私鑰進(jìn)展簽名,簽名使用的算法為MD5WithRSA newcert.signprivateKey,"MD5WithRSA";/這樣便得到了經(jīng)過CA簽名后的證書/把新證書存入證書庫/把新生成的證書存入一個(gè)新的證書庫,也可以存入原證書庫,/存入新證書庫,那么新證書庫中不僅包含原證書庫中的所有條目,/而且新增加了一個(gè)這次產(chǎn)生的條目。注意,這時(shí),新產(chǎn)生的簽名后的證書只/包括公鑰和主體信息及簽名信息,不包括私鑰信息。這里給出兩種方式。/方式一:存入新密鑰庫/

33、end方式一/也可以采用另外一種方式,存入原證書庫中/存入原庫中,即在原證書庫中增加一條證書,這個(gè)證書是原證書經(jīng)過簽名后的證書/這個(gè)新證書含有私鑰和私鑰密碼/方式二,存入原密鑰庫/先在原庫中讀出被簽證書的私鑰PrivateKey prk=PrivateKeyks.getKeyaliasName,namePass;java.security.cert.Certificate cchain=newcert;/存入原來的庫,第二個(gè)參數(shù)為原證書的私鑰,第三個(gè)參數(shù)為新證書的私鑰密碼,第三個(gè)參數(shù)為新證書ks.setKeyEntryafteraliasName,prk,afterNewPass,cchain

34、;/用新密鑰替代原來的沒有簽名的證書的密碼FileOutputStream out2=new FileOutputStreamname;ks.storeout2,storepass;/存入原來的庫中,第二個(gè)參數(shù)為該庫的訪問密碼/end方式二/運(yùn)行以上程序,即可運(yùn)用MissionCA證書來簽發(fā)abnerCA證書,運(yùn)行后在abnerCALib中增加一條別名為abnerCA_Signed的數(shù)字證書,我們將它導(dǎo)出為cer文件導(dǎo)出方法見前。至此,我們己經(jīng)用CA的證書以我們的數(shù)字證書簽名了。在windows中,雙擊導(dǎo)出的abnerCA_Signend.cer文件,出現(xiàn)如以以下圖所示:上圖中證書信息一欄顯示

35、"不能驗(yàn)證該證書",原因是因?yàn)?,我們的這個(gè)數(shù)字證書的簽發(fā)者missionCA證書沒有安裝到系統(tǒng)中。我們可以將證書庫中別名為missionCA的自簽數(shù)字證書導(dǎo)出為cer文件,然后安裝到系統(tǒng)中。再次查雙擊看此證書,如以以下圖所示:到此,我們己經(jīng)獲得了一個(gè)由我們自己的CA簽名頒發(fā)的個(gè)人數(shù)字證書。并且將我們自己的CA證書安裝到系統(tǒng)中成為系統(tǒng)信任的根證書。于是,以后只要是由我們的這個(gè)CA證書簽名頒發(fā)的數(shù)字證書都會(huì)受到系統(tǒng)的信任。四、利用數(shù)字證書給applet簽名如今假設(shè)我們公司給xx公司做一個(gè)工程,這個(gè)工程中需要用到applet,且這些applet需要特權(quán)以實(shí)現(xiàn)一些特殊的功能如讀出客

36、戶端用戶系統(tǒng)中C:winNTsystem.ini文件中的內(nèi)容并顯示。那么我們可以頒發(fā)一個(gè)數(shù)字證書,并給這個(gè)數(shù)字證書簽名,然后用簽名后的這個(gè)數(shù)字證書來簽名我們的applet,使客戶信任。詳細(xì)過程如下:1、生成一個(gè)用于此工程簽名applet的數(shù)字證書,別名定為:mission_water生成一個(gè)用于此工程簽名的數(shù)字證書如下:keytool genkey dname"CN=美森軟件-水公司工程,OU=美森系統(tǒng)軟件,O=美森系統(tǒng)軟件,L=成都市,ST=四川省,C=中國" alias Mission_Water keyalg RSA keysize 1024 keystore abn

37、erCALib keypass 200100 storepass 100200 validity 3650 2、用我們的CAmissinCA來簽發(fā)這個(gè)數(shù)字證書然后,運(yùn)行我們在前面第三節(jié)中給定的程序,注意:運(yùn)行此程序前,請修改以下參數(shù):String cerFileName="Mission_Water.cer";String aliasName="Mission_Water";String afteraliasName="Mission_Water_Signed";然后運(yùn)行,程序會(huì)在abnerCALib證書庫中產(chǎn)生一個(gè)別名為:Missi

38、on_Water_Signed的數(shù)字證書,這個(gè)證書是經(jīng)過我們的CAMissionCA簽發(fā)的。下面,我們用以下指令導(dǎo)出這個(gè)證書:keytool-export-alias Mission_Water_Signed-file Mission_Water_Signed.cer-keystore abnerCALib-rfc會(huì)生成一個(gè)Mission_Water_Signed.cer文件。3、用簽發(fā)后的數(shù)字證書來簽名我們的applet我們?nèi)缃駚碜鲆粋€(gè)簡單的applet,它的代碼如下:package com.applet;import java.awt.*;import java.awt.event.*;i

39、mport java.applet.*;import javax.swing.*;import java.io.*;public class ShowFileApplet extends JAppletprivate boolean isStandalone=false;private String content="文件的內(nèi)容是:";/自定義的提示信息private String fileName="C:WINNTsystem.ini";/讀出這個(gè)文件的內(nèi)容private TextArea ta=new TextArea10,80;/自定義的輸出框pu

40、blic String getParameterString key,String defreturn isStandalone?System.getPropertykey,def:getParameterkey!=null?getParameterkey:def;public ShowFileAppletpublic void inittryjbInit;myInit;/自己定義的方法catchException ee.printStackTrace;private void jbInitthrows Exceptionthis.setSizenew Dimension400,300;pri

41、vate void myInitString s;BufferedReader in;tryin=new BufferedReadernew FileReaderfileName;whiles=in.readLine!=nullcontent+=s+"n";catchIOException exex.printStackTrace;System.out.printlncontent;ta.setTextcontent;getContentPane.addta;public void paintGraphics gta.setTextcontent;public String

42、 getAppletInforeturn"Applet Information";public String getParameterInforeturn null;/static initializer for setting look&feel statictrycatchException e好了,這個(gè)applet寫好了,下面我們來把這個(gè)applet編譯打包成jar文件。編譯此applet文件,會(huì)在當(dāng)前目錄當(dāng)前目錄為classes目錄下生成一個(gè)comapplet的目錄構(gòu)造,在applet目錄下有一個(gè)ShowFileApplet.class,進(jìn)入當(dāng)前目錄,執(zhí)行:

43、jar cvf myapplet.jar com/applet/*.*于是在當(dāng)前目錄下產(chǎn)生一個(gè)myapplet.jar文件。然后再在當(dāng)前目錄當(dāng)前目錄為classes目錄下新建一個(gè)applet目錄,專門存放applet的jar文件,把前面生成的數(shù)字證書庫abnerCALib這個(gè)文件也copy到applet目錄下面來,同時(shí)把剛剛生成的myapplet.jar文件也移到applet目錄下面來。然后進(jìn)入該目錄執(zhí)行:jarsigner-keystore abnerCALib myapplet.jar Mission_Water_Signed Enter Passphrase for keystore:1

44、00200 Enter key password for Mission_Water_Signed:200100即用Mission_Water_Signed這個(gè)我們的CA簽發(fā)的數(shù)字證書給這個(gè)applet簽名了。4、運(yùn)行我們的applet我們來寫一個(gè)html文件來運(yùn)行這個(gè)簽名后的applet,內(nèi)容如下:<!-ShowFileApplet.html-><html><head><meta -equiv="Content-Type"content="text/html;charset=GB2312"><tit

45、le>HTMLTestPage</title></head><body>applet將會(huì)顯示,假設(shè)你的閱讀器支持Java<br><applet archive="./applet/myapplet.jar"code="com.applet.ShowFileApplet.class"name="TestApplet"width="400"height="300"hspace="0"vspace="0"

46、;align="middle"></applet></body></html>這個(gè)HTML文件可以運(yùn)行applet,但假設(shè)閱讀器不支持Java,即沒有安裝JRE,它不會(huì)提示用戶去下載安裝。我們可以用Java自帶的htmlconverter工具轉(zhuǎn)換一下這個(gè)HTML文件,轉(zhuǎn)換后的文件可以在支持JAVA2的閱讀器中不管該閱讀器是否設(shè)置了使用java2運(yùn)行applet,它都會(huì)在Java2環(huán)境中運(yùn)行applet,假設(shè)閱讀器不支持Java2,那么會(huì)自動(dòng)下載所需的文件。在DOS方式下運(yùn)行htmlconverter,彈出如以以下圖所示畫框,按圖中所示選擇剛剛的那個(gè)HTML文件,如以以下圖所示:點(diǎn)"轉(zhuǎn)換",將會(huì)在當(dāng)前目錄下生成一個(gè)HTML文件,并把原來的HTML文件備份了。生成后的HTML文件內(nèi)容如下所示:<!-ShowFileApplet.html-><html><head><meta -equiv="Content-Type"content="text/html;charset=GB2312"><title>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論