`
OpenMind
  • 浏览: 179549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java编程方式用CA给证书进行签名/签发证书

 
阅读更多

这些代码首先加载CA证书,然后分别用CA给Alice和Bob签发一个证书并保存到resource/目录下面,用jks格式存储。

CA证书也是用java编程方式制作的,制作过程请看我的上一篇博客。

 

public static void main(String[] args) throws KeyStoreException,
			NoSuchAlgorithmException, CertificateException,
			FileNotFoundException, IOException, UnrecoverableEntryException {
		//读取CA证书的JKS文件
		KeyStore store = KeyStore.getInstance("JKS");
		File file = new File("resource/atlas-ca.jks");
		store.load(new FileInputStream(file), "atlas".toCharArray());
		
		PrivateKeyEntry ke = (PrivateKeyEntry) store.getEntry("atlas",
				new PasswordProtection("atlas".toCharArray()));
		String subject = "C=CN,ST=GuangDong,L=Shenzhen,O=Skybility,OU=Cloudbility,CN=Alice,E=alice@163.com";
		//给alice签发证书并存为xxx-alice.jks的文件
		gen(ke, subject, "alice");
		subject = "C=CN,ST=GuangDong,L=Shenzhen,O=Skybility,OU=Cloudbility,CN=Bob,E=Bob@gmail.com";
		//给Bob签发证书并存为xxx-bob.jks的文件
		gen(ke, subject, "bob");
	}

	//用KeyEntry形式存储一个私钥以及对应的证书,并把CA证书加入到它的信任证书列表里面。
	public static void store(PrivateKey key, Certificate cert,
			Certificate caCert, String name) throws KeyStoreException,
			NoSuchAlgorithmException, CertificateException, IOException {
		KeyStore store = KeyStore.getInstance("JKS");
		store.load(null, null);
		store.setKeyEntry(name, key, name.toCharArray(), new Certificate[] {
				cert, caCert });
		File file = new File("resource/atlas-" + name + ".jks");
		if (file.exists() || file.createNewFile()) {
			store.store(new FileOutputStream(file), ("_"+name).toCharArray());
		}
	}

	//用ke所代表的CA给subject签发证书,并存储到名称为name的jks文件里面。
	public static void gen(PrivateKeyEntry ke, String subject, String name) {
		try {
			X509Certificate caCert = (X509Certificate) ke.getCertificate();
			KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
			kpg.initialize(2048);
			KeyPair keyPair = kpg.generateKeyPair();

			KeyStore store = KeyStore.getInstance("JKS");
			store.load(null, null);
			String issuer = caCert.getIssuerDN().toString();
			Certificate cert = generateV3(issuer, subject,
					BigInteger.ZERO, new Date(System.currentTimeMillis() - 1000
							* 60 * 60 * 24),
					new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24
							* 365 * 32), keyPair.getPublic(),//待签名的公钥
					ke.getPrivateKey()//CA的私钥
					, null);
			store(keyPair.getPrivate(), cert, ke.getCertificate(), name);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Certificate generateV3(String issuer, String subject,
			BigInteger serial, Date notBefore, Date notAfter,
			PublicKey publicKey, PrivateKey privKey, List<Extension> extensions)
			throws OperatorCreationException, CertificateException, IOException {

		X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
				new X500Name(issuer), serial, notBefore, notAfter,
				new X500Name(subject), publicKey);
		ContentSigner sigGen = new JcaContentSignerBuilder("SHA1withRSA")
				.setProvider("BC").build(privKey);
		//privKey是CA的私钥,publicKey是待签名的公钥,那么生成的证书就是被CA签名的证书。
		if (extensions != null)
			for (Extension ext : extensions) {
				builder.addExtension(new ASN1ObjectIdentifier(ext.getOid()),
						ext.isCritical(),
						ASN1Primitive.fromByteArray(ext.getValue()));
			}
		X509CertificateHolder holder = builder.build(sigGen);
		CertificateFactory cf = CertificateFactory.getInstance("X.509");
		InputStream is1 = new ByteArrayInputStream(holder.toASN1Structure()
				.getEncoded());
		X509Certificate theCert = (X509Certificate) cf.generateCertificate(is1);
		is1.close();
		return theCert;
	}
分享到:
评论

相关推荐

    Java实现浏览器CA证书的签名和验证

    ### Java实现浏览器CA证书的签名和验证 #### 概述 随着互联网的普及和技术的发展,网络安全成为了维护用户信心和确保电子商务顺利进行的关键因素之一。在众多保障网络安全的技术中,数字证书及其背后的公钥基础...

    java生成CA证书

    用户可以通过检查证书上的CA签名来确认公钥的合法性。 4. **Java中的KeyPairGenerator和KeyStore类**:在Java中,我们可以使用`KeyPairGenerator`类来生成公钥-私钥对,通常使用`KeyPairGenerator.getInstance("RSA...

    Certificate_java_java数字签名_java签名证书_数字证书_

    在Java编程环境中,数字证书和数字签名是网络安全和数据完整性的重要组成部分。这些概念与Java的加密库和证书处理机制紧密相关。在这个项目中,我们似乎有一个包含Java实现数字证书和数字签名功能的源码模块。 首先...

    JAVA 用代码生成数字证书源码

    在Java编程环境中,生成数字证书是一项关键的安全技术,主要用于数据加密、身份验证和签名等应用场景。数字证书通常包含了公钥和私钥对,以及证书持有者的相关信息,这些信息经过认证机构(CA)的签名,确保了证书的...

    java多种方式实现pdf文件电子签名

    在Java中,可以使用KeyStore类来管理和操作这些证书,包括加载、存储和选择合适的证书进行签名操作。 在实际应用中,开发者需要根据项目需求和资源选择适合的库。iTextPDF更适合需要高度定制签名外观和高级功能的...

    CA证书资源包(全版本通用)

    如果证书是由受信任的CA签发,并且没有过期或被撤销,那么浏览器就会认为该网站是安全的,可以进行加密通信。CA通过一套严谨的验证流程来确认网站所有者的身份,这个过程包括对申请者的企业资料、域名所有权等信息的...

    usb.rar_USB KEY_java Ca_usb_证书

    证书包含了用户的公钥、身份信息以及由CA签名的信息,确保公钥的真实性。在本例中,提供的程序可能包含了一些用于与USB KEY交互的代码,允许用户通过Java应用程序安全地读取或使用存储在USB设备上的证书。 在描述中...

    java生成X509证书jar包

    这个过程涉及到的标签"java"、"jar"、"开发语言"指的是使用Java编程语言进行开发并打包成jar文件;"https"和"网络协议"是指生成的X509证书在HTTPS通信中的应用。通过这个jar包,开发者可以在他们的项目中快速生成...

    java在IE中下载证书并安装(根证书)

    7. **编程实现**:在Java中,可以使用`Runtime.getRuntime().exec()`方法执行操作系统命令,例如安装证书的命令。同时,需要处理异常和错误输出,确保程序的健壮性。 8. **证书生命周期管理**:除了安装,证书还有...

    Java 数字签名、数字证书生成源码

    在这个Java源码包中,我们可能找到了用于生成数字签名和数字证书的相关代码,这对于理解和实践Java的安全编程至关重要。 数字签名是一种用于验证电子信息完整性的方法,它结合了非对称加密技术。在Java中,我们可以...

    java 发送https 请求 证书

    当你需要在Java程序中发送HTTPS请求时,可能会遇到证书相关的问题,特别是当服务器使用自签名证书或者非标准CA签发的证书时。本文将详细讲解如何在Java中处理这类问题,以及如何使用httpUtils工具进行HTTPS请求。 ...

    基于Java的数字签名、数字证书生成源码.zip

    3. 签发证书:使用`java.security.cert.X509CertGenerator`生成自签名证书,这里既是CA也是证书持有者,所以用自己的私钥对请求进行签名。 4. 导出证书:证书可以以PEM或DER格式存储,方便使用。 在给定的压缩包...

    certificate-generator-master_java证书生成_

    在Java编程环境中,生成证书是一项常见的任务,尤其在网络安全、HTTPS服务器配置以及开发自签名证书等方面有着广泛应用。标题“certificate-generator-master_java证书生成_”暗示我们关注的是一个用于生成证书的...

    java安全通信数字证书

    2. 申请数字证书:使用keytool生成CSR(Certificate Signing Request),并提交给证书颁发机构(CA)。 3. 颁发数字证书:CA验证请求后,签发证书并返回给用户。 4. 安装数字证书:将CA签发的证书导入到Keystore中。...

    JAVA对数字证书的常用操作

    在Java编程环境中,数字证书是用于验证网络身份和数据完整性的关键组件,它们通常基于公开密钥基础设施(PKI)工作。以下是对Java中数字证书的一些常见操作的详细解释: 一、所需导入的包: 在处理数字证书时,Java...

    数字证书及其简单数字签名的实现

    通过阅读`SignCert.java`,我们可以学习到实际编程中如何应用这些理论知识,例如如何使用Java的`java.security`包中的类来操作密钥和证书,以及如何集成CA的服务。 总结起来,数字证书和数字签名在保护网络安全方面...

    Des.zip_ca java

    标题中的"Des.zip_ca java"表明这是一个与Java编程语言相关的项目,主要涉及到DES(Data Encryption Standard)加密算法和CA(Certificate Authority)证书的使用。在IT领域,DES是一种经典的对称加密算法,而CA则是...

    数字证书java.rar

    在Java编程环境中,数字证书是实现安全通信的关键组件。它主要用于身份验证、数据加密和完整性保护,尤其是在网络传输中。本教程将深入讲解如何在Java中使用数字证书,包括理解其概念、创建与管理,以及如何在实际...

    Java安全教程-创建SSL连接和证书Java开发Jav

    在Java编程中,安全是至关重要的,特别是在网络通信和数据传输方面。SSL(Secure Sockets Layer)和它的继任者TLS(Transport Layer Security)是确保数据安全的重要协议,它们为网络连接提供了加密和身份验证机制。...

Global site tag (gtag.js) - Google Analytics