`
sswh
  • 浏览: 163197 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

证书制作

    博客分类:
  • java
 
阅读更多

使用bouncycastle库来制作证书(包括一个自签名证书和为他人签发证书)。

<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcpkix-jdk15on</artifactId>
	<version>1.54</version>
</dependency>

 

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;

import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;

public class CertMakeDemo {

	public static void main(String[] args) throws Exception {
		X500Name subject = new X500Name("CN=root, O=root, OU=root");
		KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
		gen.initialize(1024);
		KeyPair pair = gen.generateKeyPair();
		X509Certificate certificate = signerSelf(subject, pair);
		System.out.println("证书:" + certificate);

		KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
		pkcs12.load(null, null);
		pkcs12.setKeyEntry("root", pair.getPrivate(), "123456".toCharArray(), new Certificate[] { certificate });
		for (Enumeration<String> e = pkcs12.aliases(); e.hasMoreElements();) {
			String alias = e.nextElement();
			System.out.println(pkcs12.getCertificateChain(alias));
			System.out.println(pkcs12.getKey(alias, "123456".toCharArray()));
		}
		OutputStream out = new FileOutputStream("f:/temp/root.pfx");
		pkcs12.store(out, "123456".toCharArray());
		out.close();

		//root为张三签发证书
		X500Name zsSubject = new X500Name("CN=张三, O=张三, OU=张三");
		gen = KeyPairGenerator.getInstance("RSA");
		gen.initialize(1024);
		KeyPair zsKeypair = gen.generateKeyPair();
		X509Certificate zsCertificate = signer(zsSubject, zsKeypair.getPublic(), certificate, pair.getPrivate());
		System.out.println("张三证书:" + zsCertificate);
		out = new FileOutputStream("f:/temp/zhangsan.cer");
		out.write(zsCertificate.getEncoded());
		out.close();
	}

	public static X509Certificate signer(X500Name subject, PublicKey subjectPublicKey,// 
		X509Certificate issuerCert, PrivateKey issuerPrivateKey) throws Exception {

		X500Name issuer = X500Name.getInstance(issuerCert.getSubjectX500Principal().getEncoded());
		String signatureAlgorithm = issuerCert.getSigAlgName();
		return signer(subject, subjectPublicKey, issuer, issuerPrivateKey, signatureAlgorithm);
	}

	public static X509Certificate signerSelf(X500Name subject, KeyPair pair) throws Exception {
		String signatureAlgorithm = "SHA1With" + pair.getPrivate().getAlgorithm();
		return signer(subject, pair.getPublic(), subject, pair.getPrivate(), signatureAlgorithm);
	}

	public static X509Certificate signer(X500Name subject, PublicKey subjectPublicKey,//
		X500Name issuer, PrivateKey issuerPrivateKey, String signatureAlgorithm) throws Exception {

		BigInteger sn = new BigInteger(new SimpleDateFormat("yyyyMMdd").format(new Date()));
		Date notBefore = new Date();
		Date notAfter = new Date(notBefore.getTime() + 365L * 24 * 60 * 60 * 1000);
		SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(subjectPublicKey.getEncoded());
		ContentSigner signer = new JcaContentSignerBuilder(signatureAlgorithm).build(issuerPrivateKey);

		X509v3CertificateBuilder builder = new X509v3CertificateBuilder(//
			issuer, sn, notBefore, notAfter, subject, publicKeyInfo);
		byte[] certBytes = builder.build(signer).getEncoded();

		X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X509")//
			.generateCertificate(new ByteArrayInputStream(certBytes));

		return certificate;
	}
}

 

 

1
3
分享到:
评论
1 楼 sswh 2016-07-07  
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.Security;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;
import javax.security.auth.x500.X500Principal;

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.pkcs.ContentInfo;
import org.bouncycastle.asn1.pkcs.SignedData;
import org.bouncycastle.asn1.pkcs.SignerInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

public class PKCS7Demo {

	static Map<String, String> OIDS = new HashMap<String, String>();
	static {
		OIDS.put("1.3.14.3.2.26", "SHA1");
		OIDS.put("1.2.840.113549.1.1.1", "RSA");
	}

	public static void main(String[] args) throws Exception {
		Security.addProvider(new BouncyCastleProvider());

		InputStream in = new FileInputStream("JCE_RSA.RSA");
		byte[] content = new byte[in.available()];
		in.read(content);
		in.close();

		ASN1InputStream asnin = new ASN1InputStream(content);
		ASN1Sequence asndata = (ASN1Sequence) asnin.readObject();
		asnin.close();

		DERTaggedObject tag0 = (DERTaggedObject) asndata.getObjectAt(1);
		SignedData pkcs7 = SignedData.getInstance(tag0.getObject());
		System.out.println("版本:" + pkcs7.getVersion());
		System.out.println("消息摘要算法:" + pkcs7.getDigestAlgorithms());
		ContentInfo contentInfo = pkcs7.getContentInfo();
		System.out.println("数据类型:" + contentInfo.getContentType());
		System.out.println("数据正文:" + contentInfo.getContent());

		for (ASN1Encodable certNode : pkcs7.getCertificates().toArray()) {
			System.out.println("证书:" + new String(Hex.encode(certNode.toASN1Primitive().getEncoded())));
		}

		System.out.println("作废证书:" + pkcs7.getCRLs());
		for (ASN1Encodable signerNode : pkcs7.getSignerInfos().toArray()) {
			SignerInfo signer = SignerInfo.getInstance(signerNode);
			System.out.println("签名者信息:" + new String(Hex.encode(signerNode.toASN1Primitive().getEncoded())));
			System.out.println("版本:" + signer.getVersion());
			System.out.println("证书发行者:" + signer.getIssuerAndSerialNumber().getName());
			System.out.println("证书序列号:" + signer.getIssuerAndSerialNumber().getCertificateSerialNumber());
			System.out.println("消息摘要算法:" + signer.getDigestAlgorithm().getAlgorithm());
			System.out.println("签名时间:" + signer.getAuthenticatedAttributes());
			System.out.println("签名算法:" + signer.getDigestEncryptionAlgorithm().getAlgorithm());
			System.out.println("签名:" + signer.getEncryptedDigest());
		}

		System.out.println("-----验证签名-----");
		SignerInfo signer = SignerInfo.getInstance(pkcs7.getSignerInfos().getObjectAt(0));
		X500Principal issuer = new X500Principal(signer.getIssuerAndSerialNumber().getName().getEncoded());
		BigInteger sn = signer.getIssuerAndSerialNumber().getCertificateSerialNumber().getValue();
		CertificateFactory factory = CertificateFactory.getInstance("X.509");
		X509Certificate cert = null;
		for (ASN1Encodable certNode : pkcs7.getCertificates().toArray()) {
			X509Certificate acert = (X509Certificate) factory.generateCertificate(//  
				new ByteArrayInputStream(certNode.toASN1Primitive().getEncoded()));
			if (issuer.equals(acert.getIssuerX500Principal()) && sn.equals(acert.getSerialNumber())) {
				cert = acert;
				break;
			}
		}
		System.out.println("签名证书:" + cert.getIssuerX500Principal());
		System.out.println("证书序号:" + cert.getSerialNumber());

		String signerAlgorithm = OIDS.get(signer.getDigestEncryptionAlgorithm().getAlgorithm().getId());
		System.out.println("签名算法:" + signerAlgorithm);

		Cipher cipher = Cipher.getInstance(signerAlgorithm);
		cipher.init(Cipher.DECRYPT_MODE, cert.getPublicKey());
		cipher.update(signer.getEncryptedDigest().getOctets());
		byte[] derDecrypt = cipher.doFinal();
		System.out.println("DER格式的解密签名:" + new String(Hex.encode(derDecrypt)));

		asnin = new ASN1InputStream(derDecrypt);
		ASN1Sequence derDecryptSeq = (ASN1Sequence) asnin.readObject();
		asnin.close();
		System.out.println("解密签名中的消息摘要算法:" + ((ASN1Sequence) derDecryptSeq.getObjectAt(0)).getObjectAt(0));
		String digestAlgorithm = OIDS.get(//  
			((ASN1ObjectIdentifier) //   
			((ASN1Sequence) derDecryptSeq.getObjectAt(0)).getObjectAt(0)//  
			).getId()//  
			);
		System.out.println("解密签名中的消息摘要算法::" + digestAlgorithm);
		byte[] decryptDigest = ((ASN1OctetString) derDecryptSeq.getObjectAt(1)).getOctets();
		System.out.println("解密的消息摘要:" + new String(Hex.encode(decryptDigest)));

		in = new FileInputStream("JCE_RSA.SF");
		byte[] raw = new byte[in.available()];
		in.read(raw);
		in.close();
		MessageDigest md = MessageDigest.getInstance(digestAlgorithm);
		md.update(raw);
		byte[] rawDigest = md.digest();
		System.out.println("明文消息摘要:" + new String(Hex.encode(rawDigest)));
		System.out.println("验证通过:" + Arrays.equals(decryptDigest, rawDigest));

		System.out.println("-----使用签名服务验证-----");
		DERSequence hash = (DERSequence) pkcs7.getDigestAlgorithms().getObjectAt(0);
		String hashAlgorithm = OIDS.get(((ASN1ObjectIdentifier) hash.getObjectAt(0)).getId());
		System.out.println("签名算法:" + hashAlgorithm + "With" + signerAlgorithm);

		Signature signature = Signature.getInstance(hashAlgorithm + "With" + signerAlgorithm);
		signature.initVerify(cert);
		signature.update(raw);
		boolean result = signature.verify(signer.getEncryptedDigest().getOctets());
		System.out.println("验证通过:" + result);

	}
}

相关推荐

    pfx证书制作工具.zip

    这个“pfx证书制作工具.zip”压缩包提供了帮助用户生成和管理这些证书的工具。 RSA是一种广泛使用的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家提出,它的核心在于有一对密钥:公钥和...

    贵鹤证书制作打印助手(证书打印系统)V1.3特别版

    贵鹤证书制作打印助手(证书打印系统)是一款专业智能证书制作生成打印工具,用户直接在界面输入相应内容,设整好格式,证书即可智能生成。可以添加证书编号、附加内容、二维码等。支持EXCEL表格,可将EXCEL表格与软件...

    证书申请 证书审核 证书制作

    本文将详细阐述证书申请、证书审核和证书制作的过程,以帮助理解这一关键领域的知识。 1. **证书申请** 证书申请通常涉及到以下步骤: - **选择CA(证书颁发机构)**:CA是负责验证和签发数字证书的可信第三方。...

    根证书制作成exe文件

    本文将详细讲解如何将根证书制作成可执行(exe)文件,以便在Windows XP和Win7系统上方便地安装。 首先,理解根证书的概念至关重要。根证书是信任链的顶端,由顶级CA签发,用于验证其他二级或三级CA的证书。这些...

    ZXCA自信数字证书制作工具

    ZXCA自信数字证书制作工具是一款专为个人和小型组织设计的实用软件,它提供了制作和管理符合国际标准的数字证书的功能。在信息化高度发达的今天,数字证书是网络安全的重要组成部分,尤其是在数据加密、身份验证和...

    pfx证书制作工具

    本篇文章将围绕"pfx证书制作工具"这一主题,详细介绍相关知识点。 首先,我们需要理解PFX证书的作用。PFX证书结合了公钥和私钥对,允许用户安全地导出和导入证书,这对于开发者和系统管理员来说尤其有用,因为他们...

    塞班证书制作工具,自己动手做证书不是梦。

    在提供的压缩包文件中,可能包含了一份详细的证书制作教程(如"证书制作.docx"),以及一系列图片(如"1.jpg"到"8.jpg"),这些图片可能是证书制作过程中关键步骤的截图或指南,帮助用户更好地理解每个步骤。...

    CA系统证书制作设计与实现

    CA系统证书制作设计与实现是IT领域中关于公钥基础设施(PKI)的重要实践,它涉及到数字证书的生成、管理和验证。在这个项目中,我们主要关注的是如何利用C#编程语言来实现这些功能。 首先,我们需要理解CA...

    代码签名证书制作工具.zip

    这个"代码签名证书制作工具.zip"压缩包提供了一个方便的方式来创建自己的代码签名证书,这对于个人开发者或小型团队来说,无疑是一个经济且实用的解决方案。 首先,我们需要理解什么是代码签名证书。代码签名证书是...

    诺基亚证书制作软件包Safecert

    诺基亚证书制作软件Safecert是一款专为塞班(Symbian)系统设计的工具,用于生成诺基亚手机应用的签名证书。在塞班平台上,为了确保应用程序的安全性和防止恶意软件,所有第三方软件都需要经过签名才能在手机上安装...

    S60 手机证书 制作软件(自己动手不用申请)

    然而,标题和描述提到的“S60手机证书制作软件”提供了一种方法,允许用户自行制作证书,无需经过官方申请流程。 这个软件包包含两个文件:DevCertRequest_2.3.exe和readme.txt。DevCertRequest_2.3.exe是一个应用...

    S60V3V5证书制作工具合集FireCer

    《S60V3V5证书制作与签名:掌握FireCer工具的全面指南》 在移动设备领域,尤其是塞班(Symbian)系统中,应用开发与安装需要遵循特定的安全机制,其中证书的制作与签名是至关重要的环节。对于S60V3和V5版本的...

    HTTPS证书制作及配置全记录

    根据提供的文件信息,我们可以整理出有关HTTPS证书制作与配置的关键知识点。下面将详细介绍这些知识点,以便更好地理解HTTPS证书的工作原理及其在实际应用中的配置过程。 ### HTTPS证书制作及配置全记录 #### 一、...

    证书制作工具简单操作说明

    数字证书制作工具简单的操作说明。如有疑问QQ,EMAIL联系我。

    PFX证书制作工具

    本篇文章将详细介绍PFX证书制作工具及其相关知识点。 首先,我们需要了解PFX证书的基本概念。PFX文件包含了用户的个人信息、证书(公钥)以及与之对应的私钥,这使得它能够在一个安全的容器内存储完整的密钥对。...

    fiddlercertmaker(Fiddler证书制作).exe

    fiddlercertmaker(Fiddler证书制作).exe

    https双向证书制作详细制作步骤

    ### HTTPS 双向证书制作详细步骤 #### 一、引言 HTTPS(Hyper Text Transfer Protocol Secure)是HTTP的安全版,其主要通过SSL/TLS协议来加密传输数据,确保信息的安全性。而双向认证则是在传统的客户端信任服务器...

    ZXCA证书制作工具内含使用说明文档

    ZXCA证书制作工具是一款专为IT专业人士设计的软件,用于创建和管理数字证书。这款工具包含了一份详尽的使用说明文档,确保用户能够轻松理解和操作整个证书制作过程。在当前的网络安全环境中,数字证书扮演着至关重要...

    农村土地承包经营权证书制作

    农村土地承包经营权证书制作是一项重要的行政工作,它涉及到农村土地使用权的确权和管理。在这个过程中,使用专门的软件工具可以极大地提高效率和准确性。以下是一些相关知识点: 1. **土地承包经营权证**:这是...

    OpenSSL证书制作过程

    ### OpenSSL证书制作过程详解 #### 一、数字证书使用的场合 数字证书主要应用于以下几个场景: - **加密传输**:在互联网通信中确保数据传输的安全性,防止数据被窃听或篡改。 - **身份验证**:确认通信双方的...

Global site tag (gtag.js) - Google Analytics