




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java中的keytool.exe可以用來創(chuàng)建數(shù)字證書,所有的數(shù)字證書是以一條一條(采用別名區(qū)別)的形式存入證書庫的中,證書庫中的一條證書包含該條證書的私鑰,公鑰和對應(yīng)的數(shù)字證書的信息。證書庫中的一條證書可以導(dǎo)出數(shù)字證書文件,數(shù)字證書文件只包括主體信息和對應(yīng)的公鑰。 每一個證書庫是一個文件組成,它有訪問密碼,在首次創(chuàng)建時,它會自動生成證書庫,并要求指定訪問證書庫的密碼。 在創(chuàng)建證書的的時候,需要填寫證書的一些信息和證書對應(yīng)的私鑰密碼。這些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它們的意思是: CN(Common Name名字與姓氏) OU(Organization Unit組織單位名稱) O(Organization組織名稱) L(Locality城市或區(qū)域名稱) ST(State州或省份名稱) C(Country國家名稱) 可以采用交互式讓工具提示輸入以上信息,也可以采用參數(shù) -dname CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx來自動創(chuàng)建。 1、示例 如下所示一句采用交互式創(chuàng)建一個證書,指定證書庫為 abnerCALib,創(chuàng)建別名為abnerCA的一條證書,它指定用RSA算法生成, 且指定密鑰長度為 1024,證書有效期為3650天:C:/j2sdk1.4.1_01/mykeystorekeytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650 如下圖所示:上圖中最后一步,我們輸入的是 CN,代表中國的縮寫,也可以直接輸入“中國”兩個字。 2、證書的操作方法 證書的顯示 如:keytool list keystore 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中的別名為abnerCA的證書導(dǎo)出到abnerCA.cer證書文件中, 它包含證書主體的信息及證書的公鑰,不包括私鑰,可以公開,如下圖所示 :上面導(dǎo)出的證書文件是以二進(jìn)制編碼文件,無法用文本編輯器正確顯示,因此不利用公布證書,可以加上 -rfc參數(shù)以一種可打印的編者編碼輸出。 如:keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 rfc這個命令在命令行中指定了證書庫的訪問密碼,同時指定以可查看編碼的方式輸出。 3、通過證書文件查看證書的信息 通過命令 :keytool printcert file 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 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ù)字證書讓客戶信任。 下面我們將模仿自己是一個權(quán)威的數(shù)字證書認(rèn)證機(jī)構(gòu) CA,這個機(jī)構(gòu)將采用自己的私鑰來簽發(fā)其它的證書。這個簽發(fā)過程是這樣的:我們自己是CA,我們自己有一個自簽的數(shù)字證書存入數(shù)字證書庫中。在數(shù)字證書庫中的這個我們的CA數(shù)字證書,它含有私鑰,公鑰和我們這個CA的主體信息。下面這一個指令可以創(chuàng)建一個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這個數(shù)字證書庫中創(chuàng)建了一個別名為:missionCA、有效期為3650天、算法為RSA且密鑰長度為1024的數(shù)字證書,這條證書的私鑰密碼為:200100,證書庫的訪問密碼為:100200。這條別名為missionCA的證書代表我們自己的權(quán)威CA即:美森系統(tǒng)軟件有限公司這個權(quán)威CA。以后我們將用這個證書來簽名其它的數(shù)字證書。 現(xiàn)在我要給自己申請一個數(shù)字證書,我可以這么做:先在數(shù)字證書庫中創(chuàng)建一條證書: keytool genkey dname “CN=柴政,OU=美森系統(tǒng)軟件有限公司,O=美森系統(tǒng)軟件有限公司,L=成都市,ST=四川省,C=中國” alias abnerCA keyalg RSA keysize 1024 keystore abnerCALib keypass 200100 storepass 100200 validity 3650 這樣創(chuàng)建了一個別名為 abnerCA的數(shù)字證書,我們可以將它導(dǎo)出為cer文件(見前)。 接著,我們可以用上一步生成的 CA的自簽證書來簽名我這個數(shù)字證書了。 CA簽名數(shù)字證書的過程需用以下程序來進(jìn)行,這個程序是自解釋的:package com.security; import java.io.*; import java.security.*; import java.security.cert.*; import java.util.*; import java.math.*; import sun.security.x509.*; /* * pDescription: 該程序根據(jù)簽發(fā)者(CA)的證書信息(即CA的私鑰)來對被簽發(fā)者 * 的證書進(jìn)行簽名,過程即是使用CA的證書和被簽證書來重構(gòu)形成一個新的證書/p * author abnerchai * version 1.0 */ public class SignCert public static void main(String args) throws Exception char storepass = 100200.toCharArray();/存放CA證書和被簽證書的證書庫的訪問密碼 char cakeypass = 200100.toCharArray();/CA數(shù)字證書條目的訪問密碼 String alias = missionCA;/CA證書在證書庫中的別名,這個CA的證書用來簽名其它的證書 String name = abnerCALib;/存放CA證書和被簽證書的證書庫的名字 String newLib = SignedLib;/新證書庫的名字,如果需要將簽名后的證書放入新庫,這是新庫的名字 char newLibPass = 100200.toCharArray();/設(shè)置新庫的訪問密碼 String cerFileName = abnerCA.cer;/被簽證書的證書文件名 String aliasName = abnerCA;/被簽證書在證書庫中的alias別名 char namePass = 200100.toCharArray();/被簽證書的條目在證書庫的私鑰密碼 int n =3; /被簽證書的有效期,以年為單位,以當(dāng)前時間開始計算 int sn = 200406001;/序列號可自己定義,這里定義的意義為2004年6月簽發(fā),是本年度CA簽發(fā)的第多少個以001計算,要求唯一 String afteraliasName = abnerCA_Signed; /簽名后新產(chǎn)生的被簽過名的證書在庫中的別名 char afterNewPass = 200100.toCharArray(); /簽名后新產(chǎn)生的被簽過名的證書在庫的條目的私鑰的密碼 /裝載證書庫 FileInputStream in = new FileInputStream(name); KeyStore ks = KeyStore.getInstance(JKS);/JKS為證書庫的類型 ks.load(in,storepass); /從證書庫中讀出簽發(fā)者(CA)的證書 java.security.cert.Certificate cl = ks.getCertificate(alias);/讀出一個CA證書,這里的l是字母l不是數(shù)據(jù)字1 PrivateKey privateKey = (PrivateKey)ks.getKey(alias,cakeypass);/根據(jù)別名和證書密碼讀出CA證書的私鑰 in.close(); /從證書庫中讀出的簽發(fā)者(CA)的證書中提取簽發(fā)者的信息 byte encodl = cl.getEncoded();/提取證書的編碼,這里是字母l不是數(shù)據(jù)字1 X509CertImpl cimpl = new X509CertImpl(encodl);/這里是字母l不是數(shù)據(jù)字1,根據(jù)證書的編碼創(chuàng)建X509CertImpl類型的對象 /根據(jù)上面的對象獲得X509CertInfo類型的對象,該對象封裝了證書的全部內(nèi)容。 X509CertInfo cinfo_first = (X509CertInfo)cimpl.get(X509CertImpl.NAME+.+X509CertImpl.INFO); /然后獲得X500Name類型的簽發(fā)者信息 X500Name issuer = (X500Name) cinfo_first.get(X509CertInfo.SUBJECT+.+CertificateIssuerName.DN_NAME); /獲取待簽發(fā)的證書,即獲取被簽發(fā)者的證書 /可從密鑰庫中獲取,也可從導(dǎo)出的證書文件中獲取,這里給出兩種方式 / /方式一、采用從導(dǎo)出的cer文件中獲取 start / /* CertificateFactory cf = CertificateFactory.getInstance(X.509);/X.509是使用最多的一種數(shù)字證書標(biāo)準(zhǔn) FileInputStream in2 = new FileInputStream(cerFileName);/被簽證書文件 java.security.cert.Certificate c2 = cf.generateCertificate(in2);/生成需要被簽的證書 in2.close(); byte encod2 = c2.getEncoded(); X509CertImpl cimp2 = new X509CertImpl(encod2); /獲得被簽證書的詳細(xì)內(nèi)容,然后根據(jù)這個證書生成新證書 X509CertInfo cinfo_second = (X509CertInfo)cimp2.get(X509CertImpl.NAME+.+X509CertImpl.INFO); */ / /end 方式一 / / /方式二、從證書庫中讀出被簽的證書 start / java.security.cert.Certificate c3 = ks.getCertificate(aliasName);/從證書庫中讀出被簽證書,然后生成新的證書 byte encod3 = c3.getEncoded(); X509CertImpl cimp3 = new X509CertImpl(encod3); X509CertInfo cinfo_second = (X509CertInfo)cimp3.get(X509CertImpl.NAME+.+X509CertImpl.INFO); / /end方式二 / /設(shè)置新證書的有效期,使之為當(dāng)前向后n年有效,新證書的 /截止日期不能超過CA證書的有效日期 Date beginDate = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(beginDate); cal.add(cal.YEAR,n); Date endDate = cal.getTime(); CertificateValidity cv = new CertificateValidity(beginDate,endDate); cinfo_second.set(X509CertInfo.VALIDITY,cv); /設(shè)置新證書的序列號 CertificateSerialNumber csn = new CertificateSerialNumber(sn); cinfo_second.set(X509CertInfo.SERIAL_NUMBER,csn); /設(shè)置新證書的簽發(fā)者 cinfo_second.set(X509CertInfo.ISSUER+.+CertificateIssuerName.DN_NAME,issuer); /新的簽發(fā)者是CA的證書中讀出來的 /設(shè)置新證書的算法,指定CA簽名該證書所使用的算法為md5WithRSA AlgorithmId algorithm = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid); cinfo_second.set(CertificateAlgorithmId.NAME+.+ CertificateAlgorithmId.ALGORITHM,algorithm); /創(chuàng)建新的簽名后的證書 X509CertImpl newcert = new X509CertImpl(cinfo_second); /簽名,使用CA證書的私鑰進(jìn)行簽名,簽名使用的算法為MD5WithRSA newcert.sign(privateKey,MD5WithRSA);/這樣便得到了經(jīng)過CA簽名后的證書 /把新證書存入證書庫 /把新生成的證書存入一個新的證書庫,也可以存入原證書庫, /存入新證書庫,則新證書庫中不僅包含原證書庫中的所有條目, /而且新增加了一個這次產(chǎn)生的條目。注意,這時,新產(chǎn)生的簽名后的證書只 /包括公鑰和主體信息及簽名信息,不包括私鑰信息。這里給出兩種方式。 / /方式一:存入新密鑰庫 / /* ks.setCertificateEntry(afteraliasName,newcert); FileOutputStream out = new FileOutputStream(newLib); /存入新庫signedLib,并設(shè)置新庫的庫訪問密碼 ks.store(out,newLibPass); out.close(); */ / /end 方式一 / /也可以采用另外一種方式,存入原證書庫中 /存入原庫中,即在原證書庫中增加一條證書,這個證書是原證書經(jīng)過簽名后的證書 /這個新證書含有私鑰和私鑰密碼 / /方式二,存入原密鑰庫 / /先在原庫中讀出被簽證書的私鑰 PrivateKey prk = (PrivateKey)ks.getKey(aliasName,namePass); java.security.cert.Certificate cchain = newcert; /存入原來的庫,第二個參數(shù)為原證書的私鑰,第三個參數(shù)為新證書的私鑰密碼,第三個參數(shù)為新證書 ks.setKeyEntry(afteraliasName,prk,afterNewPass,cchain); /用新密鑰替代原來的沒有簽名的證書的密碼 FileOutputStream out2 = new FileOutputStream(name); ks.store(out2,storepass);/存入原來的庫中,第二個參數(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)如下圖所示:上圖中證書信息一欄顯示“不能驗證該證書”,原因是因為,我們的這個數(shù)字證書的簽發(fā)者 missionCA證書沒有安裝到系統(tǒng)中。我們可以將證書庫中別名為missionCA的自簽數(shù)字證書導(dǎo)出為cer文件,然后安裝到系統(tǒng)中。再次查雙擊看此證書,如下圖所示: 到此,我們己經(jīng)獲得了一個由我們自己的 CA簽名頒發(fā)的個人數(shù)字證書。并且將我們自己的CA證書安裝到系統(tǒng)中成為系統(tǒng)信任的根證書。于是,以后只要是由我們的這個CA證書簽名頒發(fā)的數(shù)字證書都會受到系統(tǒng)的信任。四、利用數(shù)字證書給 applet簽名 現(xiàn)在假設(shè)我們公司給 xx公司做一個項目,這個項目中需要用到applet,且這些applet需要特權(quán)以實(shí)現(xiàn)一些特殊的功能(如讀出客戶端用戶系統(tǒng)中C:/winNT /system.ini文件中的內(nèi)容并顯示)。那么我們可以頒發(fā)一個數(shù)字證書,并給這個數(shù)字證書簽名,然后用簽名后的這個數(shù)字證書來簽名我們的 applet,使客戶信任。具體過程如下: 1、生成一個用于此項目簽名 applet 的數(shù)字證書,別名定為: mission_water 生成一個用于此項目簽名的數(shù)字證書如下: keytool genkey dname “CN=美森軟件-水公司項目,OU=美森系統(tǒng)軟件有限公司,O=美森系統(tǒng)軟件有限公司,L=成都市,ST=四川省,C=中國” alias Mission_Water keyalg RSA keysize 1024 keystore abnerCALib keypass 200100 storepass 100200 validity 3650 2、用我們的 CA(missinCA) 來簽發(fā)這個數(shù)字證書 然后,運(yùn)行我們在前面第三節(jié)中給定的程序,注意:運(yùn)行此程序前,請修改以下參數(shù):String cerFileName = Mission_Water.cer; String aliasName = Mission_Water; String afteraliasName = Mission_Water_Signed; 然后運(yùn)行,程序會在 abnerCALib證書庫中產(chǎn)生一個別名為:Mission_Water_Signed的數(shù)字證書,這個證書是經(jīng)過我們的CA(MissionCA)簽發(fā)的。 下面,我們用以下指令導(dǎo)出這個證書:keytool -export -alias Mission_Water_Signed -file Mission_Water_Signed.cer -keystore abnerCALib -rfc 會生成一個 Mission_Water_Signed.cer 文件。 3、用簽發(fā)后的數(shù)字證書來簽名我們的 applet 我們現(xiàn)在來做一個簡單的 applet,它的代碼如下:package com.applet; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.*; public class ShowFileApplet extends JApplet private boolean isStandalone = false; private String content = 文件的內(nèi)容是:; /自定義的提示信息 private String fileName = C:/WINNT/system.ini;/讀出這個文件的內(nèi)容 private TextArea ta = new TextArea(10,80);/自定義的輸出框 public String getParameter(String key, String def) return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); public ShowFileApplet() public void init() try jbInit(); myInit();/自己定義的方法 catch(Exception e) e.printStackTrace(); private void jbInit() throws Exception this.setSize(new Dimension(400,300); /* * 自定義的初始化方法,讀入系統(tǒng)中的一個文件的內(nèi)容并保存起來,然后,增加一個 * 可視化的輸出框 */ private void myInit() String s; BufferedReader in; try in = new BufferedReader(new FileReader(fileName); while ( (s = in.readLine() != null) content +=s + /n; catch (IOException ex) ex.printStackTrace(); System.out.println(content); ta.setText(content); getContentPane().add(ta); /* *重載的方法,輸出內(nèi)容 */ public void paint(Graphics g) ta.setText(content); public String getAppletInfo() return Applet Information; public String getParameterInfo() return null; /static initializer for setting look & feel static try catch(Exception e) 好了,這個 applet寫好了,下面我們來把這個applet編譯打包成jar文件。 編譯此 applet文件,會在當(dāng)前目錄(當(dāng)前目錄為classes目錄)下生成一個com/applet的目錄結(jié)構(gòu),在applet目錄下有一個ShowFileApplet.class,進(jìn)入當(dāng)前目錄,執(zhí)行:jar cvf myapplet.jar com/applet/*.* 于是在當(dāng)前目錄下產(chǎn)生一個 myapplet.jar文件。 然后再在當(dāng)前目錄(當(dāng)前目錄為 classes目錄)下新建一個applet目錄,專門存放applet的jar文件,把前面生成的數(shù)字證書庫abnerCALib這個文件也copy到 applet目錄下面來,同時把剛才生成的myapplet.jar文件也移到applet目錄下面來。然后進(jìn)入該目錄執(zhí)行:jarsigner -keystore abnerCALib myapplet.jar Mission_Water_Signed Enter Passphrase for keystore: 100200 Enter key password for Mission_Water_Signed: 200100 即用 Mission_Water_Signed這個我們的CA簽發(fā)的數(shù)字證書給這個applet簽名了。 4、運(yùn)行我們的 applet 我們來寫一個 html文件來運(yùn)行這個簽名后的applet,內(nèi)容如下:!- ShowFileApplet.html - html head meta http-equiv=Content-Type content=text/html; charset=GB2312 titleHTMLTestPage/title /headbody applet將會顯示,如果你的瀏覽器支持Javabr applet archive = ./applet/myapplet.jar code = com.applet.ShowFileApplet.class name = TestApplet width = 400 height = 300 hspace = 0 vspace = 0 align = middle /applet /body /html 這個 HTML文件可以運(yùn)行applet,但如果瀏覽器不支持Java,即沒有安裝JRE,它不會提示用戶去下載安裝。我們可以用Java自帶的 htmlconverter工具轉(zhuǎn)換一下這個HTML文件,轉(zhuǎn)換后的文件可以在支持JAVA2的瀏覽器中(不管該瀏覽器是否設(shè)置了使用java2運(yùn)行 applet,它都會在Java2環(huán)境中運(yùn)行applet,如果瀏覽器不支持Java2,則會自動下載所需的文件。 在 DOS方式下運(yùn)行htmlconverter,彈出如下圖所示畫框,按圖中所示選擇剛才的那個HTML文件,如下圖所示:點(diǎn)“轉(zhuǎn)換”,將會在當(dāng)前目錄下生成一個 HTML文件,并把原來的HTML文件備份了。 生成后的 HTML文件內(nèi)容如下所示:!- ShowFileApplet.html - html head meta http-equiv=Content-Type content=text/html; charset=GB2312 titleHTMLTestPage/title
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)院系管理制度
- 專用量具管理制度
- 專線回單管理制度
- 專職講師管理制度
- 專項儲備管理制度
- 業(yè)務(wù)窗口管理制度
- 嚴(yán)格收據(jù)管理制度
- 中介門店管理制度
- 中醫(yī)機(jī)構(gòu)管理制度
- 中型商場管理制度
- 音樂與藝術(shù)在全球中的多樣性與融合
- 真實(shí)情境下的“5E”教學(xué)模式在高中化學(xué)教學(xué)中的應(yīng)用與成效探究
- 基于項目驅(qū)動的創(chuàng)新實(shí)踐課程設(shè)計
- 2025中考英語閱讀考點(diǎn)專項突破訓(xùn)練:旅游(學(xué)生版+解析)
- 專利培訓(xùn)試題及答案
- 國際工程投標(biāo)管理制度
- 2025河南濮陽市南樂縣紀(jì)委監(jiān)委招聘編外看護(hù)隊員筆試易考易錯模擬試題(共500題)試卷后附參考答案
- 納米技術(shù)在靶向藥物delivery中的創(chuàng)新應(yīng)用-洞察闡釋
- 口譯人員保密協(xié)議書
- 第四版(2025)國際壓力性損傷潰瘍預(yù)防和治療臨床指南解讀
- 2025江西中考:歷史高頻考點(diǎn)
評論
0/150
提交評論