为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > java 数字签名

java 数字签名

2018-03-08 15页 doc 166KB 6阅读

用户头像

is_668482

暂无简介

举报
java 数字签名java 数字签名 ;extra=&page=1 1、示例 如下所示一句采用交互式创建一个证书,指定证书库为 abnerCALib,创建别名为 abnerCA的一条证书,它指定用RSA算法生成, 且指定密钥长度为 1024,证书有效期为3650天: keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650 显示证书的详细信息 keytool -list -v -alias abnerC...
java 数字签名
java 数字签名 ;extra=&page=1 1、示例 如下所示一句采用交互式创建一个证书,指定证书库为 abnerCALib,创建别名为 abnerCA的一条证书,它指定用RSA算法生成, 且指定密钥长度为 1024,证书有效期为3650天: keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650 显示证书的详细信息 keytool -list -v -alias abnerCA -keystore abnerCALib 将证书导出到证书文件 keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib 上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此不利用公布证 书,可以加上 -rfc参数以一种可打印的编者编码输出。 如: keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 –rfc 这个命令在命令行中指定了证书库的访问密码,同时指定以可查看编码的方式输出 证书条目口令的修改 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是指证书库的密码。 CA签名数字证书的过程需用以下程序来进行,这个程序是自解释的: package com.security; import java.io.*;8T5l6j5u8o(e3n/n%_&A import java.security.*;TechWeb-技术社区,X3e,|6@/c import java.security.cert.*;1N&U6S#d*v8S6O import java.util.*;1n,_3_9h/Z5D"j){ import java.math.*;程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9[*Q/a*k4U1@!v2T4J6v import sun.security.x509.*;TechWeb-技术社区+j%b,e;l G/_(Y+{ /** * ,p,Description: 该程序根据签发者(CA)的证书信息(即CA的私钥)来对被签发者 * 的证书进行签名,过程即是使用CA的证书和被签证书来重构形成一个新的证书,/p, * @author abnerchaitech.techweb.com.cn4h0p)j:[,f(j8H * @version 1.0$F#Y5n'O3X&e3L */ public class SignCert { public static void main(String[] args) throws Exception{;Q6j*T,?"h&A*V)y(u char[] storepass = "100200".toCharArray();&{2I9q/z(L$@7|3H //存放CA证书和被签证书的证书库的访问密码 *F-E1R,e"N(\:W(v%`0B char[] cakeypass = "200100".toCharArray();//CA数字证书条目的访问密码 TechWeb-技术社区&M2S*h.P'q String alias = "missionCA";&T.A#m!O5Y8I0{ //CA证书在证书库中的别名,这个CA的证书用来签名其它的证书 1?,c!K#V'?(g2~ String name = "abnerCALib";//存放CA证书和被签证书的证书库的名字 String newLib = "SignedLib";&C)@)a5].| //新证书库的名字,如果需要将签名后的证书放入新库,这是新库的名字 char[] newLibPass = "100200".toCharArray();//设置新库的访问密码 tech.techweb.com.cn&B-F({"T6j"L&p7| String cerFileName = "abnerCA.cer";//被签证书的证书文件名 tech.techweb.com.cn&? j.?7x!I+~!Q"X String aliasName = "abnerCA";//被签证书在证书库中的alias别名 char[] namePass = "200100".toCharArray();'k0^#`+v(E2J5E //被签证书的条目在证书库的私钥密码 :L2b'x,|6~ m int n =3; //被签证书的有效期,以年为单位,以当前时间开始计算 TechWeb-技术社区9f8C/?(d.Y"N5V1Y*Q!L8U4S int sn = 200406001;8L*G+z&v2R'o$W/f8c //序列号可自己定义,这里定义的意义为2004年6月签发,是本年度CA签发的第多少个以001计算,唯一 String afteraliasName = "abnerCA_Signed";)A3?9m9g9z"H0w(Z,~)u/]5H //签名后新产生的被签过名的证书在库中的别名 TechWeb-技术社区$O1P(f%m(z,F;X#` char[] afterNewPass = "200100".toCharArray(); //签名后新产生的被签过名的证书在库的条目的私钥的密码 //装载证书库 *H+a:M"V.J6@)s7x5x6H FileInputStream in = new FileInputStream(name); KeyStore ks = KeyStore.getInstance("JKS");//JKS为证书库的类型 ks.load(in,storepass); //从证书库中读出签发者(CA)的证书 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛6z9b#M;^4g2C Z)o java.security.cert.Certificate cl = ks.getCertificate(alias);4V't-`.}-l'f W //读出一个CA证书,这里的l是字母l不是数据字1 PrivateKey privateKey = (PrivateKey)ks.getKey(alias,cakeypass); //根据别名和证书密码读出CA证书的私钥 ,I+E+u5M8H%?,X#L0x(w!V4u;u in.close(); //从证书库中读出的签发者(CA)的证书中提取签发者的信息 TechWeb-技术社区5Y1[6M7E+B+Y'_5S3Q"V9P byte[] encodl = cl.getEncoded();//提取证书的编码,这里是字母l不是数据字1 TechWeb-技术社区/{2~-Z$[+m3o0W X509CertImpl cimpl = new X509CertImpl(encodl);tech.techweb.com.cn6U,i,D2M-C5_ X509CertImpl类型的对象 //这里是字母l不是数据字1,根据证书的编码创建tech.techweb.com.cn*w#q&}2I-o1w+F![ //根据上面的对象获得X509CertInfo类型的对象,该对象封装了证书的全部。 tech.techweb.com.cn4M5[#f/{#W1[:E:E X509CertInfo cinfo_first = (X509CertInfo)cimpl.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);tech.techweb.com.cn#Y2?2W-S-c2^-u //然后获得X500Name类型的签发者信息 X500Name issuer = (X500Name) cinfo_first.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);tech.techweb.com.cn%z8w1h&{"_*f(v)R;J4P //获取待签发的证书,即获取被签发者的证书 //可从密钥库中获取,也可从导出的证书文件中获取,这里给出两种方式 //////////////////////////////////////////////////////////////////////// //方式一、采用从导出的cer文件中获取 start /////////////////////////////////////////////////////////////////////////////// /* CertificateFactory cf = CertificateFactory.getInstance("X.509");TechWeb-技术社区&g/p#X9V0P-}%D [*D //X.509是使用最多的一种数字证书0i'G*j.e9y"T:R&S9Z FileInputStream in2 = new FileInputStream(cerFileName);//被签证书文件 java.security.cert.Certificate c2 = cf.generateCertificate(in2);tech.techweb.com.cn!l(N0F!u+]#\ 生成需要被签的证书 // in2.close();tech.techweb.com.cn.}$v%{/Y0{0f7r,c1i9d.U byte[] encod2 = c2.getEncoded(); X509CertImpl cimp2 = new X509CertImpl(encod2); //获得被签证书的详细内容,然后根据这个证书生成新证书 X509CertInfo cinfo_second =程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛8A6M+]*H+G$A (X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);3w6?&m,m"b-~ */6@/o0l*y3{/U,x5|6B%V /////////////////////////////////////////////////////////////////////////////// *c+r6T9p#E7J1\,{*k/r //end 方式一 //方式二、从证书库中读出被签的证书 start /////////////////////////////////////////////////////////////////////////////// java.security.cert.Certificate c3 = ks.getCertificate(aliasName); 从证书库中读出被签证书,然后生成新的证书 //TechWeb-技术社区2P+g3t2V3l0d9u7a&h byte[] encod3 = c3.getEncoded();TechWeb-技术社区(u#B2Q1c6y+@ X509CertImpl cimp3 = new X509CertImpl(encod3); X509CertInfo cinfo_second = (X509CertInfo)cimp3.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); /////////////////////////////////////////////////////////////////////////// TechWeb-技术社区/a9j0l"R)r&f,`+}'B/z //end方式二 /////////////////////////////////////////////////////////////////////////// //设置新证书的有效期,使之为当前向后n年有效,新证书的 //截止日期不能超过CA证书的有效日期 +d(B:v%M { Date beginDate = new Date();TechWeb-技术社区0f!B6z'Z&r2[ Calendar cal = Calendar.getInstance(); cal.setTime(beginDate);*v%O&E/]4O,c.R/b'p9`1[ cal.add(cal.YEAR,n); Date endDate = cal.getTime();'T"M-k/h%`"E'@)j,R1W:a CertificateValidity cv = new CertificateValidity(beginDate,endDate);tech.techweb.com.cn#]%Q&K/A4~3o [2w:d cinfo_second.set(X509CertInfo.VALIDITY,cv);tech.techweb.com.cn,C;B*e `,m(}8^ //设置新证书的序列号 CertificateSerialNumber csn = new CertificateSerialNumber(sn); cinfo_second.set(X509CertInfo.SERIAL_NUMBER,csn);tech.techweb.com.cn6k1D)b8?%f //设置新证书的签发者 cinfo_second.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer); //新的签发者是CA的证书中读出来的 //设置?***为md5WithRSA TechWeb-技术社区(H"`-r5P/P5h 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2M&d$P*A!R2h X*M5r AlgorithmId algorithm = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);.w ?3]:c*N"X;| cinfo_second.set(CertificateAlgorithmId.NAME+"."+ CertificateAlgorithmId.ALGORITHM,algorithm); //创建新的签名后的证书 X509CertImpl newcert = new X509CertImpl(cinfo_second); //签名,使用CA证书的私钥进行签名,签名使用的算法为MD5WithRSA 2_!x3N6\,s$M!P newcert.sign(privateKey,"MD5WithRSA");//这样便得到了经过CA签名后的证书TechWeb-技术社区$K-F'j/K'o0S //把新证书存入证书库TechWeb-技术社区+t:R.g;\;s8W //把新生成的证书存入一个新的证书库,也可以存入原证书库, //存入新证书库,则新证书库中不仅包含原证书库中的所有条目, //而且新增加了一个这次产生的条目。注意,这时,新产生的签名后的证书只程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2M o(g.[6T:f,N:j+P //包括公钥和主体信息及签名信息,不包括私钥信息。这里给出两种方式。 "i/P-b&E6R0p!U)? /////////////////////////////////////////////////////////////////////////// //方式一:存入新密钥库 tech.techweb.com.cn%i/c:c/D O'p$k /////////////////////////////////////////////////////////////////////////// tech.techweb.com.cn9_5`+M {$n-o!n!T /*!C&@ K3{7Q:[;[:C2K ks.setCertificateEntry(afteraliasName,newcert); FileOutputStream out = new FileOutputStream(newLib);TechWeb-技术社区%B5T'X.S)y#f"A //存入新库signedLib,并设置新库的库访问密码 ks.store(out,newLibPass);TechWeb-技术社区+N-P9K&x#v'N/I out.close(); */tech.techweb.com.cn&\7y0z-V/j!w /////////////////////////////////////////////////////////////////////////// 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛$?!K.D/k"n;V //end 方式一 /////////////////////////////////////////////////////////////////////////// ,B0X8n4D#K4O/W;Y //也可以采用另外一种方式,存入原证书库中 //存入原库中,即在原证书库中增加一条证书,这个证书是原证书经过签名后的证书 //这个新证书含有私钥和私钥密码 (n%W4T0q#i.x;q3d#V ;d7D$x*@3_ /////////////////////////////////////////////////////////////////////////// //方式二,存入原密钥库 (s,A"L)y$[#_,R-l /////////////////////////////////////////////////////////////////////////// //先在原库中读出被签证书的私钥 PrivateKey prk = (PrivateKey)ks.getKey(aliasName,namePass);程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛,F7[0m2B ^({ java.security.cert.Certificate[] cchain = {newcert}; //存入原来的库,第二个参数为原证书的私钥,第三个参数为新证书的私钥密码,第三个参 数为新证书 ks.setKeyEntry(afteraliasName,prk,afterNewPass,cchain); //用新密钥替代原来的没有签名的证书的密码 4y8{7W+N d(R+A+j6W*h(E4{ #i#T(M;c;c!u7\5j9o5N*^ FileOutputStream out2 = new FileOutputStream(name); ks.store(out2,storepass);//存入原来的库中,第二个参数为该库的访问密码 //end 方式二 2J0Z5K(O*[6s5{(z 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛&o#Q2h/d#b.k /////////////////////////////////////////////////////////////////////////// } } 运行以上程序,即可运用 MissionCA证书来签发abnerCA证书,运行后在abnerCALib中增加一条别名为abnerCA_Signed的数字证书,我们将它导出为cer文件(导出方法见前)。 tech.techweb.com.cn2f!]4f.a'S 至此,我们己经用 CA的证书以我们的数字证书签名了。在windows中,双击导出的abnerCA_Signend.cer文件,出现如下图所示: 上图中证书信息一栏显示“不能验证该证书”,原因是因为,我们的这个数字证书的签发者 missionCA证书没有安装到系统中。我们可以将证书库中别名为missionCA的自签数字证书 导出为cer文件,然后安装到系统中。再次查双击看此证书,如下图所示: 到此,我们己经获得了一个由我们自己的 CA签名颁发的个人数字证书。并且将我们自己的CA证书安装到系统中成为系统信任的根证书。于是,以后只要是由我们的这个CA证书签名颁发的数字证书都会受到系统的信任。 这个 HTML文件可以运行applet,但如果浏览器不支持Java,即没有安装JRE,它不会提示用户去下载安装。我们可以用Java自带的htmlconverter工具转换一下这个HTML文件,转换后的文件可以在支持JAVA2的浏览器中(不管该浏览器是否设置了使用java2运行applet,它都会在Java2环境中运行applet,如果浏览器不支持Java2,则会自动下载所需的文件。 在 DOS方式下运行htmlconverter,弹出如下图所示画框,按图中所示选择刚才的那个HTML文件,如下图所示: 点“转换”,将会在当前目录下生成一个 HTML文件,并把原来的HTML文件备份了。 双击打开运行这个文件或把这个文件及 applet目录发布到WEB Server中去,可以访问运 行这个applet。运行时,弹出如下图所示对话框: 如果此时你点“是”,则在这次会话过程中,此 applet具有访问本地文件系统的权限,但下次运行时还要提示此信息。如果你点“总是有效”则以后每次访问此类含有由Mission_Water_Signed数字证书签发的applet页面,都不会再弹出此选择框。因为:你选择了总是有效,这样,Java会在Java Plug-in中记录这个信任的数字证书,除非你把Java Plug-in中记录的这个信任证书删除。在win2k中,可以在“控制面版”-,Java Plug-in中看到。如下图所示: 点选择“总是有效”后,该程序运行的结果如下图所示:
/
本文档为【java 数字签名】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索