Java加密和数字签名 5数字证书

最近初步接触了下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();
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值