⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 certreq.java

📁 用纯java语言实现的数字证书制作工具。
💻 JAVA
字号:
package data;

import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import java.io.*;
import data.MyWindowListener;
import java.sql.*;
import data.Connect;
import data.BASE64Encoder;
import data.CertReqInfo;
import data.Base64;
import java.math.*;
import sun.security.pkcs.*;
import sun.security.x509.*;
import java.security.cert.*;

//该类从CertReqInfo实例得到用户的信息byte[] myinfo,
//首先用BASE64对用户信息编码。生成证书请求文件CertReq.txt
//用SHA-1算法计算摘要信息digestMD,生成digestMD(数字摘要).dat
//从数据库AdminData读取管理员的密钥,对摘要信息进行数字签名,生成Signature.dat
//生成用户自签发的证书User.cer

public class CertReq
{
	X509Key pbkey;
	RSAPrivateKey prkey,adminprkey;
	RSAPublicKey adminpbkey;
	BASE64Encoder BE=new BASE64Encoder();
	Base64 DE=new Base64();
	String plaintext,query;
	byte[] digestMD,b_pbk,b_prk;
	byte[] signeddata,myinfo;
	String s_pbk,s_prk,cryptotext;
	CertAndKeyGen cak;
	File file1=new File("temp_pbk.dat");
	File file2=new File("temp_prk.dat");
	
	
	public CertReq(String MyID)
	{	
		//获取用户信息
		CertReqInfo cri=new CertReqInfo(MyID);
		plaintext="CN="+cri.UN			//UserName
				   +",C="+cri.N			//Nation
				   +",L="+cri.C 		//City
				   +",OU="+cri.U		//Unit
				   +",O="+cri.O			//Orgnization
				   +",ST="+cri.ID;		//IDCard
		System.out.println(plaintext);

		//生成用户的公钥和私钥,其中公钥邦定到申请文件中
		try{
		cak = new CertAndKeyGen("RSA","MD5WithRSA");
		
		//genkeys
		cak.generate(1024);
		prkey=(RSAPrivateKey)cak.getPrivateKey();
		pbkey=cak.getPublicKey();

		//密钥存入数据库**********************
		ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
     	ObjectOutputStream oos1 = new ObjectOutputStream(baos1);	
     	oos1.writeObject(prkey); 
     	oos1.close();
     	b_prk=baos1.toByteArray();
     	baos1.close();
		s_prk=BE.encode(b_prk);
		System.out.println("您的私钥\n"+s_prk);
		
		ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
     	ObjectOutputStream oos2 = new ObjectOutputStream(baos2);	
     	oos2.writeObject(pbkey); 
     	oos2.close();
     	b_pbk=baos2.toByteArray();
     	baos2.close();
		s_pbk=BE.encode(b_pbk);
		System.out.println("您的公钥:\n"+s_pbk);
		
		try{
			Connect conn=new Connect();
			Statement stmt=conn.con.createStatement();
			query = "insert into UserKey(UserID,AlgorithmNumber,UserPublicKey,"
						+"UserPrivateKey) values ('"
						+MyID+"','RSA','"+s_pbk+"','"+s_prk+"')";	
				
				stmt.executeUpdate(query);
				System.out.println("Insert Suceed!");
				System.out.println("您的密钥对已经进入数据库!");
				System.out.println("您的公钥是\n"+s_pbk+"\n您的密钥是\n"+s_prk);
     	  		stmt.close();
				conn.con.close();
		
		}catch(SQLException se)
       		{
       			String mm;
	       		mm="数据库执行错误:"+se.getMessage();
	     	  	System.out.println(mm);
       			
       		}
		
		//用户主体信息
		X500Name subject = new X500Name(plaintext);
		X509Certificate certificate = cak.getSelfCertificate(subject,10);
		FileOutputStream fos = new FileOutputStream(new File("User.cer"));
		fos.write(certificate.getEncoded());
		fos.close();
		
		
		//对用户信息进行BASE64编码
		PKCS10 tmp=cak.getCertRequest(subject);
	
		//tmp转换成为字节流
		myinfo=tmp.getEncoded();
			
		cryptotext=BE.encode(myinfo);
		System.out.println("cryptotext"+cryptotext);	
		}catch(Exception e){
			System.out.println("不能产生密钥对!");
		}
		//生成PKCS#10标准的证书请求文件CSR**********
		try{
			FileWriter fw=new FileWriter("CertReq.txt"); 
			BufferedWriter bw=new BufferedWriter(fw); 
			bw.write("-----BEGIN CERTIFICATE REQUEST-----"); 
			bw.newLine();
			bw.write(cryptotext);
			bw.newLine();
			bw.write("-----END CERTIFICATE REQUEST-------");
     		bw.flush();
     		fw.close();
		}catch(IOException i)
			{
				System.out.println("IOException!");
				return;
			}
		
		//对用户的信息用SHA-1算法计算摘要信息digestMD
	try{
		MessageDigest MD=MessageDigest.getInstance("SHA-1");
		MD.update(myinfo);//add digested info
		digestMD=MD.digest();//compute the message digest
		
		String result="";
		for(int i=0;i<digestMD.length;i++)
		{
			result+=Integer.toHexString((0x000000ff &digestMD[i])|0xffffff00).substring(6);
		}
		System.out.println(result);
		
/*	try{
		FileOutputStream f = new FileOutputStream("digestMD(数字摘要).dat");
     	f.write(digestMD);
			}
			catch(IOException i)
			{
				System.out.println("IOException!");
				return;
			}
		*/
		}
		catch(NoSuchAlgorithmException e)
		{
			System.out.println("NoSuchAlgorithmException!");
			return;
		} 
		
		//用RAadmin的私钥加密用户信息摘要byte[] digestMD(数字签名)
		String query;
		try{
			
			Connect conn=new Connect();
			Statement stmt=conn.con.createStatement();
			query="select * from AdminData where AdminID=1";
			ResultSet rs=stmt.executeQuery(query);
			int result=0;
			while(rs.next())
			{
				result++;
				try{
				s_pbk=rs.getString(3);
				byte[] b_pbk =DE.decode(s_pbk.getBytes());

				FileOutputStream f_pbk = new FileOutputStream(file1);
     			f_pbk.write(b_pbk);
     			System.out.println(b_pbk.toString());
     			
				s_prk=rs.getString(4);
				byte[] b_prk =DE.decode(s_prk.getBytes());
				System.out.println(b_prk.toString());
			
     			FileOutputStream f_prk = new FileOutputStream(file2);
     			f_prk.write(b_prk);
     			
     			}catch(IOException i){
     				System.out.println("临时文件创建错误!");
     			}
				
			}
			if(result==0)/*****测试临时文件读入,跳过数据库,==->!=******/
			{
				System.out.println("管理员还没有密钥对进行签名,请管理员先生成自己密钥对!");
				AdminGenKey two=new AdminGenKey();
				two.setBounds(400,360,240,130);
			}
			else 
			{
				//将读出的管理员密钥字符串转换成RSAPublicKey/RSAPrivateKey结构
			try{
				
     			ObjectInputStream o_pbkey=
     					new ObjectInputStream(new FileInputStream(file1));
     			
     			try{
     				adminpbkey=(RSAPublicKey)o_pbkey.readObject();
     				System.out.println(adminpbkey+"\n");
     				}catch(ClassNotFoundException cnfe){
     				System.out.println("ClassNotFoundException!");
     			}
     			
     			
     			ObjectInputStream o_prkey=
     				new ObjectInputStream(new FileInputStream(file2));
     			try{adminprkey=(RSAPrivateKey)o_prkey.readObject();
     				System.out.println(adminprkey+"\n");
     				}catch(ClassNotFoundException c2){
     					System.out.println("ClassNotFoundException!");
     			}
     			//删除临时文件
     			try { 
					
					if(file1.exists()&&file2.exists()&&file1.delete()&&file2.delete()) 
						{ 
							System.out.println("文件存在,已删除!"); 
							 
						} 
					else 
						{ 
							System.out.println("文件不存在!"); 
						} 
					}catch(Exception g){
						System.out.println("删除临时文件错误!");
					}
     			
     			
     			
     			
				}
				catch(IOException o){
					System.out.println("临时文件读取错误!");
				}
				stmt.close();
				conn.con.close();
				
				//计算管理员的签名(用管理员的私钥加密数字摘要信息)
			try{
				Signature s=Signature.getInstance("MD5WithRSA");
				s.initSign(adminprkey);
				s.update(digestMD);
				signeddata=s.sign();
				}
				catch(Exception ae){
					System.out.println("Something wrong!");
				}
				
				//打印签名
				System.out.println("\n");
				
				
			try{
				
				ObjectOutputStream o_signed=
				new ObjectOutputStream(new FileOutputStream("Signature.dat"));
				o_signed.writeObject(signeddata);
				o_signed.close();
				System.out.println("IO finished!");
				}
				catch(IOException ie)
				{
					System.out.println("IO Wrong!");
				}
				
			}
			}
			catch(SQLException ie)
			{
				String mm;
	       		mm="数据库执行错误:"+ie.getMessage();
	       		System.out.println("SQLException:"+ie.toString());
			}
		
	}
	
/*	public static void main(String args[]) throws Exception
	{
		CertReq cr=new CertReq("31060516");
	}
*/	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -