package com.gg.test;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
public class TestSecurity {
public static void main(String[] args){
String caName="c:\\certificate.crt";
TestSecurity ts = new TestSecurity();
System.out.println("****读出数字证书******");
ts.readNormal(caName);
System.out.println("*****以字符串形式读出证书中得所有信息*****");
ts.readBin(caName);
}
//读出证书方法
public int readNormal(String caName){
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); //载入证书类型
InputStream is = new FileInputStream(caName);//输入文件
X509Certificate x509certificate =(X509Certificate) certFactory.generateCertificate(is);//解释输入文件
/*打印一系列信息*/
System.out.println( "类型: "+x509certificate.getType());//类型,此处为X.509
System.out.println( "版本: "+x509certificate.getVersion());//版本
System.out.println( "标题: "+x509certificate.getSubjectDN().getName());//标题
System.out.println( "得到开始的有效日期: "+x509certificate.getNotBefore().toString());//得到开始的有效日期
System.out.println( "得到截止的日期: "+x509certificate.getNotAfter().toString());//得到截止的日期
System.out.println( "得到序列号: "+x509certificate.getSerialNumber().toString(16));//得到序列号
System.out.println( "得到发行者名: "+x509certificate.getIssuerDN().getName());//得到发行者名
System.out.println( "得到签名算法: "+x509certificate.getSigAlgName());//得到签名算法
System.out.println( "得到公钥算法: "+x509certificate.getPublicKey().getAlgorithm());//得到公钥算法
is.close();//关闭流
} catch (Exception e) {
e.printStackTrace();
return -1;
}
return 0;
}
//以字符串形式读出证书中得所有信息
public int readBin(String caName){
try {
InputStream is = new FileInputStream(caName);
DataInputStream dis = new DataInputStream(is);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
while(bais.available()>0){
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(bais);
System.out.println(cert.toString());
}
is.close();
dis.close();
} catch (Exception e) {
e.printStackTrace();
return -1;
}
return 0;
}
/*
* 使用自签证书实例
*/
public static void crypt(byte[] cipherText,String file){
try {
//生成公钥
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
Key key = keyGen.generateKey();
//生成DES的Cipher
Cipher cdes =Cipher.getInstance("DES");
cdes.init(Cipher.ENCRYPT_MODE, key);
byte[] ct = cdes.doFinal(cipherText);
try {
//加密后的文件写回磁盘
FileOutputStream out = new FileOutputStream(file);
out.write(ct);
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 把消息发送给CA进行消息签名,或者说生成数字证书
*/
public void signature(byte[] sigText,String file,String pswd,String keyStore,String alias){
char[] kpass;
int i;
try {
KeyStore ks = KeyStore.getInstance("JKS");
//keyStore默认为名字为.keyStore得隐藏文件,在用户的主目录下
BufferedInputStream ksbufin = new BufferedInputStream(new FileInputStream(keyStore));
//访问keyStore的密码
kpass = new char[pswd.length()];
for(i=0;i<pswd.length();i++){
kpass[i]= pswd.charAt(i);
};
ks.load(ksbufin,kpass);
//取得CA得私钥来进行数字签名
PrivateKey priv =(PrivateKey)ks.getKey(alias, kpass);
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initSign(priv);
rsa.update(sigText);
byte[] sig = rsa.sign();
System.out.println("sig is done");
try {
FileOutputStream out = new FileOutputStream(file);
out.write(sig);
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 接收消息对数字证书进行验证
*/
public static void veriSignature(byte[] updateData,byte[] sigedText,String certName){
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
FileInputStream fin = new FileInputStream(certName);
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(fin);
//通过自签证书获得公钥
PublicKey pub = cert.getPublicKey();
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initVerify(pub);
rsa.update(updateData);
//验证
boolean verifies = rsa.verify(sigedText);
System.out.println("verified "+ verifies);
if(verifies){
System.out.println("Verify is done!");
}else{
System.out.println("verify is not successful");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}