Java 生成数字证书系列(三)生成数字证书

前两篇把基本的概念和构成都大致的说了一下,今天这篇文章,主要是讲一下,如何使用 Java 代码生成 CA 证书,以及在生成证书的时候,需要设置的一些属性。

正文

废话不多说,直接上内容。

这里使用的是 Java 的 api ,以及第三方的一个组件 —— BC,(Bouncy Castle)。稍微介绍一下 BC,Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。而我们将要使用的就是非常常用的非对称算法 RSA 加密算法。

下面我们来看一下具体的代码。

CAConfig (配置接口)

<span style="font-family:Comic Sans MS;font-size:12px;">package com.cacss.jsceu.context;

/**
 * Created With IntelliJ IDEA.
 *
 * @author : lee
 * @group : sic-ca
 * @Date : 2014/12/30
 * @Comments : 配置接口
 * @Version : 1.0.0
 */
public interface CAConfig {

	/**
	 * C
	 */
	String CA_C = "CN";
	/**
	 * ST
	 */
	String CA_ST = "BJ";
	/**
	 * L
	 */
	String CA_L = "BJ";
	/**
	 */
	String CA_O = "SICCA";

	/**
	 * CA_ROOT_ISSUER
	 */
	String CA_ROOT_ISSUER="C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN=SICCA";
	/**
	 * CA_DEFAULT_SUBJECT
	 */
	String CA_DEFAULT_SUBJECT="C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN=";

	String CA_SHA="SHA256WithRSAEncryption";

}</span>

BaseCert (证书类)

<span style="font-family:Comic Sans MS;font-size:12px;">package com.cacss.jsceu.test;

import com.cacss.jsceu.context.CAConfig;
import com.cacss.jsceu.util.CertUtil;
import com.cacss.jsceu.util.DateUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V3CertificateGenerator;

import javax.security.auth.x500.X500Principal;
import java.security.*;
import java.security.cert.X509Certificate;

/**
 * Created With IntelliJ IDEA.
 *
 * @author : lee
 * @group : sic-ca
 * @Date : 2014/12/30
 * @Comments : 证书类
 * @Version : 1.0.0
 */
@SuppressWarnings("all")
public class BaseCert {
	/**
	 * BouncyCastleProvider
	 */
	static {
		Security.addProvider(new BouncyCastleProvider());
	}
	/**
	 *
	 */
	protected static KeyPairGenerator kpg = null;

	/**
 *
 */
	public BaseCert() {
		try {
            // 采用 RSA 非对称算法加密
			kpg = KeyPairGenerator.getInstance("RSA");
            // 初始化为 1023 位
			kpg.initialize(1024);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 生成 X509 证书
	 * @param user
	 * @return
	 */
	public X509Certificate generateCert(String user) {
		X509Certificate cert = null;
		try {
			KeyPair keyPair = this.kpg.generateKeyPair();
            // 公钥
			PublicKey pubKey = keyPair.getPublic();
            // 私钥
			PrivateKey priKey = keyPair.getPrivate();
			X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
            // 设置序列号
			certGen.setSerialNumber(CertUtil.getNextSerialNumber());
            // 设置颁发者
			certGen.setIssuerDN(new X500Principal(CAConfig.CA_ROOT_ISSUER));
            // 设置有效期
			certGen.setNotBefore(DateUtil.getCurrDate());
			certGen.setNotAfter(DateUtil.getNextYear());
            // 设置使用者
			certGen.setSubjectDN(new X500Principal(CAConfig.CA_DEFAULT_SUBJECT + user));
			// 公钥
			certGen.setPublicKey(pubKey);
            // 签名算法
			certGen.setSignatureAlgorithm(CAConfig.CA_SHA);
			cert = certGen.generateX509Certificate(priKey, "BC");
		} catch (Exception e) {
			System.out.println(e.getClass() + e.getMessage());
		}
		return cert;
	}
}</span>

GenerateCa (测试类)

<span style="font-family:Comic Sans MS;font-size:12px;">package com.cacss.jsceu.test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;

/**
 * Created With IntelliJ IDEA.
 *
 * @author : lee
 * @group : sic-ca
 * @Date : 2014/12/30
 * @Comments : 测试证书类
 * @Version : 1.0.0
 */
public class GenerateCa {
    private static String certPath = "d:/lee.cer";
    public static void main(String[] args) {
        BaseCert baseCert = new BaseCert();
        X509Certificate cert = baseCert.generateCert("Lee");
        System.out.println(cert.toString());

        // 导出为 cer 证书
        try {
            FileOutputStream fos = new FileOutputStream(certPath);
            fos.write(cert.getEncoded());
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (CertificateEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</span>

效果图

下面是生成的证书,以及导出为 cer 格式的证书。

控制台打印

<span style="font-family:Microsoft YaHei;font-size:12px;">Version: 3
	 SerialNumber: 1419920991041
		 IssuerDN: CN=SICCA,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CN
	   Start Date: Tue Dec 30 14:29:51 CST 2014
	   Final Date: Wed Dec 30 14:29:51 CST 2015
		SubjectDN: CN=Lee,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CN
	   Public Key: RSA Public Key
		modulus: a9d5cc7de42c9afb468d7eb493bc69721443c0734edcb170ff13e062cc1b8d12e92edd347403d702288c5094ef2d0b2e811e0ee779a5e0a0cb7d5c75f30c5063eaa87aae7ba06bb3cf6ce6b0a5b0cd0cc2756255aff91fb09266b5dbbb6af491b5313947529d6a1fc30b9407ba1059bae909226c34e196b53c757a5826ffe147
public exponent: 10001

Signature Algorithm: SHA256WITHRSA
		Signature: 8b8b725292147e9dbe8054ed99453386e1e6ba3d
				   8248b31a2dcb477900005207c039898dd2af4675
				   310471d3097f1aa3b6ff7e197f2ccf292dcd8ad1
				   ce6f19204a54a2dc8fe1fe118eaf81004ad06c7c
				   a04631f8a376272ddda5d4ae4980a1e2a3ee444e
				   a6b80a8532358f5e1a1b82c6a54ea2e36a02d3ea
				   8758c799df308d78</span>

cer 证书

结束语

我这里使用的是第三方的组件 BC 包进行加密的,采用的是 RSA 的加密算法,证书中的密钥长度为 1024 位,当然,你也可以设置为 2048 位,根据你自己的需要选择即可。不过,需要说明的一点是,在使用公(私)钥加密的时候,需要加密的字符串的长度是有要求的,以 1024 位的密钥长度来说,那么需要加密的字符串的长度不能超过
117 个字符,计算公式:1024 / 8 - 11 = 117。所以,在加密长字符串的时候,就需要采用分片加密的方法了,这一点需要注意,当然,后续讲加密的文章中,我也会说明这一点。

时间: 2024-10-26 12:44:22

Java 生成数字证书系列(三)生成数字证书的相关文章

Java学习之Xml系列三:dtd校验、改、增、删

见摘要.见代码注释,其他话不多说: DTD文档: <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT SwordLibrary (Sword*)> <!ELEMENT Sword (SwordName,Price,Attack)> <!ELEMENT SwordName (#PCDATA)> <!ELEMENT Price (#PCDATA)> <!ELE

Java基础复习笔记系列 三

前几节都是基础中的基础,从第三讲的笔记开始,每次笔记针对Java的一个知识块儿.  Java异常处理 1.什么是异常? 异常是指运行期出的错误.比如说:除以一个0:数组越界:读取的文件不存在. 异常处理,要把异常控制在程序员合理范围之内.如数组越界indexOutOfArray,在用户看来是不可以被理解的,所以,程序员要捕获这种异常,反馈到前端告诉用户是“超出了范围”. Java中针对异常事件,自动生成一个异常对象.这个异常对象封装了异常事件的信息并将其提交给Java运行时系统.Java运行时系

Java性能优化指南系列(三):理解JIT编译器

即时编译器概述 编译器在编译过程中通常会考虑很多因素.比如:汇编指令的顺序.假设我们要将两个寄存器的值进行相加,执行这个操作一般只需要一个CPU周期:但是在相加之前需要将数据从内存读到寄存器中,这个操作是需要多个CPU周期的.编译器一般可以做到,先启动数据加载操作,然后执行其它指令,等数据加载完成后,再执行相加操作.由于解释器在解释执行的过程中,每次只能看到一行代码,所以很难生成上述这样的高效指令序列.而编译器可以事先看到所有代码,因此,一般来说,解释性代码比编译性代码要慢.不过,解释性代码具有

Java 生成数字证书系列(二)剖析数字证书

序 上一篇介绍了一下 CA 证书的几个相关概念,这几个概念还是很重要的,目的在于了解数字证书,以及其的工作原理.这篇文章主要是对 CA 证书进行剖析,讲一下证书的基本构成,这对于生成正确的.可以访问的证书是必不可少的. 构成 废话不多说,直接上内容. 先看一下证书到底是什么,在 Windows 下查看证书时(这里以 cer 为例),界面是这样的. 常规 选项卡里,主要介绍了证书信息,颁发者,和有效日期等. 而 详细信息 选项卡中,包含的信息是比较多的,他们都是以一种 Key - Value 的形

Java 生成数字证书系列(一)了解数字证书

序 最近的工作一直围绕着数字证书,对于 CA 证书的了解还是多少有一点的,只不过没有那么深入,现在要用到这方面的东西,显然还是有点欠缺,那么从这篇开始,我就将我自己的学习.工作历程跟大家一同分享,希望对想了解 CA 证书的童鞋有所帮助吧. 很显然,这篇文章大部分都是理论介绍,后续会有相关的一些实例.不喜欢看理论的童鞋,可以直接略过此章,直接看后续的文章. 概要 这篇文章,我主要是想谈一下 CA 证书的工作原理,数字签名,证书格式等几个比较重要的概念.因为在后续的文章中,都会用到这几个概念,而且,

java ssl https 连接详解 生成证书

我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容 就需要SSL.这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面. 2)HTTPS和HTTP的区别 a.

生成随机的18位十六进制数字

这里的for循环之所以条件小于2,是为了增加十六进制数据的复杂度 至于生成多少个十六进制的数字,根据所需 拼接的结果字符串有点瑕疵,使用的时候手动处理去掉最后一个逗号","即可.     /**      * 生成随机的18位      * 十六进制数字      */     function random ()     {         $arr = array();         $str = 1;         while($str <= 18)         {

java算法--三个数字比较大小

import java.util.Scanner;//比较大小public class Main3 { public static void main(String[] args) { input2 fnc=new input2(); int x=0,y=0,z=0; System.out.println("输入第一个数字:"); x=fnc.input(); System.out.println("输入第二个数字:"); y=fnc.input(); System

生成100万行8位纯数字的随机数(转)

本人转自http://www.cnblogs.com/goody9807/archive/2011/07/01/2095380.html,感谢博主的辛勤写作! 如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的:1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小2.    控制不重复3.    考虑性能针对这个问题,我写了如下的示例来解决,希望能为有这类需求的人提供指导 生成100万条8位不重复数据的示例 USE tempdbGO -- 1.创建测试表CRE

Java秒杀系统实战系列~分布式唯一ID生成订单编号

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的"分布式唯一ID生成算法-雪花算法"来实现. 内容: 在上一篇博文,我们完成了商品秒杀业务逻辑的代码实战,在该代码中,我们还实现了"当用户秒杀成功后,需要在数据库表中为其生成一笔秒杀成功的订单记录&qu