java加密和数字签名5 数字证书
来源:互联网 发布:真三国无双剧情知乎 编辑:程序博客网 时间:2024/05/17 09:13
转载:http://blog.csdn.net/jiangzhuzhu/article/details/5205050
最近初步接触了下Java加密和数字签名的相关内容,我学习的过程大概分五步:
1)消息摘要
2)私钥加密
3)公钥加密
4)数字签名
5)数字证书
下面的代码是第五部分:数字证书
比起前四部分,这部分就稍微麻烦点了,我想我有必要给刚刚接触数字证书的朋友们,把在本地跑通下面代码的前提说一下:
1此例是对“数字证书”文件的操作,所以,你先要在本地建立一个证书库
2建立证书库(密钥库)
cmd中输入:C:/>keytool -genkey -alias TestCertification -keyalg RSA -keysize 1024 -keystore BocsoftKeyLib -validity 365
意思是:在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用 RSA 算法生成,且指定密钥长度为1024,证书有效期为1年
建立库的过程中会询问问题,详见第5条
3将证书导出到证书文件TC.cer
在cmd中输入:C:/>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib
意思是:将把证书库BocsoftKeyLib中的别名为TestCertification的证书导出到TC.cer证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开
4以上3步就基本上完成了证书的操作,下面操作是可选的
导出的证书文件无法用文本编辑器正确显示,可以输入如下命令,然后在以记事本形式打开TC.cer就能看了,看看传说中的证书里到底写的什么鬼东西~~~
C:/>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib -storepass keystore -rfc
5在创建证书库时,系统会询问如下问题:
输入keystore密码: keystore(你证书库的密码)
您的名字与姓氏是什么?
[Unknown]: miaozhuang
您的组织单位名称是什么?
[Unknown]: csii
您的组织名称是什么?
[Unknown]: csii
您所在的城市或区域名称是什么?
[Unknown]: tianjin
您所在的州或省份名称是什么?
[Unknown]: tianjin
该单位的两字母国家代码是什么
[Unknown]: ch
CN=miaozhuang, OU=csii, O=csii, L=tianjin, ST=tianjin, C=ch 正确吗?
[否]:
上面的信息都是随便输入的,无关大局
此时输入: y 回车即可(别像我一样,输个yes……傻死了)
package security;import java.security.*;import java.security.PublicKey;import java.io.*;import java.util.*;import java.security.*;import java.security.cert.*;import sun.security.x509.*;import java.security.cert.Certificate;import java.security.cert.CertificateFactory;/** * 此例是对“数字证书”文件的操作 * java平台(在机器上安装jdk)为你提供了密钥库(证书库),cmd下提供了keytool命令就可以创建证书库 * * 在运行此例前: * 在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用 * RSA 算法生成,且指定密钥长度为1024,证书有效期为1年 * 导出证书文件为TC.cer已存于本地磁盘C:/ * 密码是keystore */public class DigitalCertificate { public static void main(String[] args) { try { //前提:将证书库中的一条证书导出到证书文件(我写的例子里证书文件叫TC.cer) //从证书文件TC.cer里读取证书信息 /*CertificateFactory cf = CertificateFactory.getInstance("X.509"); FileInputStream in = new FileInputStream("C:/TC.cer"); //将文件以文件流的形式读入证书类Certificate中 Certificate c = cf.generateCertificate(in); System.err.println("转换成String后的证书信息:"+c.toString());*/ //或者不用上面代码的方法,直接从证书库中读取证书信息,和上面的结果一摸一样 String pass="keystore"; FileInputStream in2=new FileInputStream("C:/BocsoftKeyLib"); KeyStore ks=KeyStore.getInstance("JKS"); ks.load(in2,pass.toCharArray()); String alias = "TestCertification"; //alias为条目的别名 Certificate c=ks.getCertificate(alias); System.err.println("转换成String后的证书信息:"+c.toString()); //获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法 X509Certificate t=(X509Certificate)c; //从信息中提取需要信息 System.out.println("版本号:"+t.getVersion()); System.out.println("序列号:"+t.getSerialNumber().toString(16)); System.out.println("主体名:"+t.getSubjectDN()); System.out.println("签发者:"+t.getIssuerDN()); System.out.println("有效期:"+t.getNotBefore()); System.out.println("签名算法:"+t.getSigAlgName()); byte [] sig=t.getSignature();//签名值 PublicKey pk = t.getPublicKey(); byte [] pkenc=pk.getEncoded(); System.out.println("公钥:"); for(int i=0;i<pkenc.length;i++){ System.out.print(pkenc[i]+","); } System.err.println(); //证书的日期有效性检查,颁发的证书都有一个有效性的日期区间 Date TimeNow=new Date(); t.checkValidity(TimeNow); System.out.println("证书的日期有效性检查:有效的证书日期!"); //验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书,比如:caroot.crt文件 //我手里没有CA颁给我的证书,所以下面代码执行不了 /*FileInputStream in3=new FileInputStream("caroot.crt"); //获取CA证书 Certificate cac = cf.generateCertificate(in3); //获取CA的公钥 PublicKey pbk=cac.getPublicKey(); //c为本地证书,也就是待检验的证书,用CA的公钥校验数字证书c的有效性 c.verify(pbk);*/ } catch(CertificateExpiredException e){//证书的日期有效性检查:过期 System.out.println("证书的日期有效性检查:过期"); } catch(CertificateNotYetValidException e){ //证书的日期有效性检查:尚未生效 System.out.println("证书的日期有效性检查:尚未生效"); } catch (CertificateException ce) { ce.printStackTrace(); } catch (FileNotFoundException fe) { fe.printStackTrace(); } /*catch (IOException ioe){ } catch (KeyStoreException kse){ }*/ catch (Exception e){ e.printStackTrace(); } }}
- java加密和数字签名5 数字证书
- Java加密和数字签名数字证书五
- 数字签名/数字证书和数据加密
- Java的数字签名和数字证书
- java 之 数字签名和数字证书
- Java的数字签名和数字证书
- java中的数字签名和数字证书
- 深入理解加密、解密、数字签名和数字证书
- 深入理解加密、解密、数字签名和数字证书
- Android安全加密:数字签名和数字证书
- 深入理解加密、解密、数字签名和数字证书
- Android安全加密:数字签名和数字证书
- 深入理解加密、解密、数字签名和数字证书
- 加密,数字签名与数字证书
- 加密,数字签名,数字证书
- Java加密和数字签名
- Java加密和数字签名
- Java加密和数字签名
- oracle之修改已经定义好的表、列信息
- RAC生产库现场调整备份策略实战-视频分享
- 组合数学引论 第一章 答案 6-10
- java日期Calendar类获取年月日小时分秒星期
- 苗木产业已成为促进冠县农民发家致富的绿色银行
- java加密和数字签名5 数字证书
- 获取系统当前日期的指定多少天的数据sql
- PHP + mysql query
- 充分利用显示游标属性
- 从内存角度理解指针和数组(二)
- 票据保证的当事人
- BIEE11g安装
- Mac下挂载EFI分区
- LoadRunner中的参数与变量