`

数字证书

阅读更多
KeyTool证书管理
    KeyTool是Java中的数字证书管理工具,用于数字证书的申请、导入、导出和撤销等操作。KeyTool与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。KeyTool位于%JDK_HOME%\bin目录中,需要通过命令行进行相应的操作。

1. 构建自签名证书
keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity
36000 -alias www.zlex.org -keystore zlex.keystore

各参数的含义如下所示:
-genkeypair 表示生成密钥。
-keyalg 指定密钥算法,这里指定为RSA算法。
-keysize 指定密钥长度,默认1024位,这里指定为2048位。
-sigalg 指定数字签名算法,这里指定为SHA1withRSA算法。
-validity 指定证书有效期,这里指定为36000天。
-alias 指定别名,这里是www.zlex.org。
-keystore 指定密钥库存储位置,这里是zlex.keystore。
KeyTool工具支持RSA和DSA共2种算法,且DSA算法为默认算法。


导出数字证书
keytool -exportcert -alias www.zlex.org -keystore zlex.keystore -file zlex.cer -rfc

各参数的含义如下所示:
-exportcert 表示证书导出操作。
-alias 指定导别名,这里为www.zlex.org。
-keystore 指定密钥库文件,这里为zlex.keystore。
-file 指定导出文件路径,这里为zlex.cer。
-rfc 指定以Base64编码格式输出。


这里通过KeyTool工具直接导出的证书,是一个自签名的X.509第三版类型的根证书,并以
Base64编码保存。自签名证书虽然可以使用,但未经过CA机构认证,几乎没有任何法律效力。


构建CA签发证书
如果要获取CA机构认证的数字证书,需要将数字证书签发申请(CSR)导出,经由CA机
构认证并颁发,同时将认证后的证书导入本地密钥库和信任库。

导出数字证书签发申请
keytool -certreq -alias www.zlex.org -keystore zlex.keystore -file zlex.csr -v

-certreq 表示数字证书申请操作。
-alias 指定别名,这里为www.zlex.org。
-keystore 指定密钥库文件,这里为zlex.keystore。
-file 指定导出文件路径,这里为zlex.csr。
-v 详细信息。


获得签发后的数字证书后,需要将其导入信任库。导入数字证书操作

导入数字证书
keytool -importcert -trustcacerts -alias www.zlex.org -file zlex.cer -keystore zlex.keystore


导入证书后,我们可以通过相关命令查看该证书,命令如下:
keytool -list -alias www.zlex.org -keystore zlex.keystore

各参数的含义如下所示:
-list 表示导入数字证书。
-alias 指定别名,这里为www.zlex.org。
-keystore 指定密钥库文件,这里为zlex.keystore。


证书使用:
    Java 6提供了完善的数字证书管理实现,仅通过操作密钥库和数字证书就可完成相应的加密/解密和签名/验证操作。密钥库管理私钥,数字证书管理公钥,私钥和密钥分属消息传递两方,进行加密消息传递


	public static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias,String password)
	
		throws Exception
    {
		
		//获取密钥库
		KeyStore ks=getKeyStore(keyStorePath, password);
		
		//获得私钥
		return (PrivateKey)ks.getKey(alias, password.toCharArray());
		
		
	}



// 由Certificate获得公钥

private static PublicKey getPublicKeyByCertificate(String certificatePath)
		throws Exception
	{
		
		//获得证书
		Certificate certificate=getCertificate(certificatePath);
		
		//获得公钥
		return certificate.getPublicKey();
	}
	


//获得Certificate
private static Certificate getCertificate(String certificatePath)
		throws Exception
	{
		
		CertificateFactory certificateFactory=CertificateFactory.getInstance(CERT_TYPE);
		
		FileInputStream in=new FileInputStream(certificatePath);
		
		Certificate certificate=certificateFactory.generateCertificate(in);
		
		in.close();
		
		return certificate;
	}



private static KeyStore getKeyStore(String keyStorePath,String password)
	
		throws Exception{
		
		//实例化密钥库
		KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());
		
		//获得密钥库文件流
		FileInputStream is=new FileInputStream(keyStorePath);
		
		//加载密钥库
		ks.load(is,password.toCharArray());
		
		//关闭密钥库文件流
		is.close();
		
		return ks;
	}
	



私钥加密:
public static byte[] encryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password)
		throws Exception
	{
		//获取私钥
		PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath, alias, password);
		
		//对数据加密
		Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());
		
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		
		return cipher.doFinal(data);
		
	}



//私钥解密

public static byte[] decryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password)
		throws Exception
	{
		
		//获取私钥
		PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath, alias, password);
		
		//对数据解密
		Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());
		
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		
		return cipher.doFinal(data);
		
	}



//公钥加密

public static byte[] encryptByPublicKey(byte[] data,String certificatePath)
		throws Exception
	{
		//取得公钥 
		PublicKey publicKey=getPublicKeyByCertificate(certificatePath);
		
		//对数据加密
		Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());
		
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		
		return cipher.doFinal(data);
		
	}



//公钥解密
public static byte[] decryptByPublicKey(byte[] data,String certificatePath)
		throws Exception
	{
		//取得公钥
		PublicKey publicKey=getPublicKeyByCertificate(certificatePath);
		
		Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());
		
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		
		return cipher.doFinal(data);
		
		
	}



//签名
	public static byte[] sign(byte[] sign,String keyStorePath,String alias,String password)
		throws Exception
	{
		//获得证书
		X509Certificate x509Certificate=(X509Certificate)getCertificate(keyStorePath, alias, password);
		
		//构建签名,由证书指定签名算法
		Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());
		
		//获取私钥
		PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath, alias, password);
		
		//初始化签名,由私钥构建
		signature.initSign(privateKey);
		
		signature.update(sign);
		
		return signature.sign();
		
		
		
	}



//验证签名
public static boolean verify(byte[] data,byte[] sign,String certificatePath)
		throws Exception
	{
		
		//获得证书
		X509Certificate x509Certificate=(X509Certificate)getCertificate(certificatePath);
		
		//由证书构建签名
		Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());
		
		//由证书初始化签名,实际上用到了证书中的公钥
		signature.initVerify(x509Certificate);
		
		signature.update(data);
		
		return signature.verify(sign);
		
		
	}


测试用例如下:
public class CertificateCoderTest {
	
	private String password = "100889";
	private String alias = "www.zlex.org";
	private String certificatePath = "E:/jdk1.6/bin/zlex.cer";
	private String keyStorePath = "E:/jdk1.6/bin/zlex,keystore";
	
	@Test
	public void test1() throws Exception
	{
		System.err.println("公钥加密-----私钥解密");
		String inputStr="数字签名";
		
		byte[] data=inputStr.getBytes();
		
		//公钥加密
		byte[] encrypt=CertificateCoder.encryptByPublicKey(data, certificatePath);
		
		//私钥解密
		byte[] decrypt=CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, password); 
	
		String outputStr=new String(decrypt);
		
		System.out.println("--"+outputStr);
		System.err.println("加密前:\n"+inputStr);
		
		System.err.println("解密后:\n"+outputStr);
		
		assertArrayEquals(data, decrypt);
	   
	}
	
	
	
	/**
	* 私钥加密—公钥解密
	* @throws Exception
	*/
	@Test
	public void test2() throws Exception {
		System.err.println("私钥加密—公钥解密");
		String inputStr = "数字签名";
		byte[] data = inputStr.getBytes();
		// 私钥加密
		byte[] encodedData = CertificateCoder.encryptByPrivateKey(data,
		keyStorePath, alias, password);
		// 公钥加密
		byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData,
		certificatePath);
		String outputStr = new String(decodedData);
		System.err.println("加密前:\n" + inputStr);
		System.err.println("解密后:\n" + outputStr);
		assertEquals(inputStr, outputStr);
	}
	
	
	
	/**
	* 签名验证
	* @throws Exception
	*/
	@Test
	public void testSign() throws Exception 
	{
		String inputStr = "签名";
		byte[] data = inputStr.getBytes();
		System.err.println("私钥签名—公钥验证");
		// 产生签名
		byte[] sign = CertificateCoder.sign(data, keyStorePath, alias, password);
		System.err.println("签名:\n" + Hex.encodeHexString(sign));
		
		// 验证签名
		boolean status = CertificateCoder.verify(data, sign, certificatePath);
		System.err.println("状态:\n" + status);
		
		
		// 校验
		assertTrue(status);
	}

}
分享到:
评论

相关推荐

    电信数智商用密码数字证书合格检测工具2.1.5版

    SM2数字证书,充分借鉴与吸收了X509数字证书的格式与优点,在考虑RSA算法的优缺点之后,推出的基于商密公钥算法的SM2证书规范,至此,商密算法的数字证书在商用密码应用安全性评估中成为了必须要检测的一个重要环节...

    数字证书实验详细步骤及原理

    数字证书实验详细步骤及原理 数字证书是实现安全通信的重要手段之一。实验目的旨在让学生了解 PKI 体系、用户证书申请和 CA 颁发证书过程、认证服务的安装及配置方法、使用数字证书配置安全站点的方法、使用数字...

    数字签名和数字证书

    在IT安全领域,数字签名和数字证书是两个关键概念,它们在确保数据的完整性和身份验证方面发挥着至关重要的作用。本文将详细解释这两个概念,以及它们之间的关系,并结合C#编程语言,探讨如何实现证书和签名功能。 ...

    标准内部OA系统数字证书应用平台方案

    ### 标准内部OA系统数字证书应用平台方案 #### 一、项目背景 随着信息技术的快速发展,特别是计算机技术、通信技术和互联网技术的进步,社会经济信息化的步伐显著加快。电子政务和电子商务的发展不仅加速了社会...

    ZXCA自信数字证书制作工具

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

    vs2017数字证书certificates.rar

    在IT行业中,数字证书在软件开发,特别是Visual Studio 2017(简称VS2017)中扮演着至关重要的角色。它们是确保代码安全、验证开发者身份以及实现安全通信的关键工具。"vs2017数字证书certificates.rar"这个压缩包很...

    java代码生成数字证书

    Java代码生成数字证书涉及到几个关键概念和技术,包括Java的密钥和证书管理、RSA加密算法以及非交互式证书创建。在此,我们将深入探讨这些主题,以便理解如何在Java环境中生成和使用数字证书。 1. **数字证书**:...

    广州数字证书驱动64位

    标题中的“广州数字证书驱动64位”指的是适用于64位操作系统的数字证书驱动程序,这类驱动主要用于确保计算机系统能够正确识别和使用数字证书。在IT领域,数字证书是一种重要的安全工具,它基于公钥加密技术,用于...

    国密数字证书验证-SM2、SM3、SM4

    这些算法在数字证书验证中扮演着至关重要的角色,确保了网络通信的安全和数据的完整性。 首先,我们要了解数字证书。在网络安全中,数字证书是一种电子文档,用于证明网络实体的身份。它包含了持有者的公开密钥、...

    金报税盘税务数字证书驱动2.3.0.13.zip

    金报税盘税务数字证书驱动2.3.0.13.zip是一款专为财务会计人员设计的重要软件包,主要用于报税过程中的数据安全传输和身份验证。这款驱动程序确保了企业在进行电子报税时,能够使用金报税盘这一硬件设备进行安全、...

    辽宁特种行业数字证书安装手册

    ### 辽宁特种行业数字证书安装手册知识点梳理 #### 一、安装证书助手 ##### 1. 寻找安装程序 - **目标**: 找到正确的安装程序图标。 - **操作**: 在计算机或安装介质中查找名为“证书助手”的安装程序。 ##### 2....

    税务系统数字证书应用接口规范.doc

    《税务系统数字证书应用接口规范》是一份详细阐述税务系统中数字证书应用接口的技术文档,旨在规范税务系统中数字证书的身份认证、签名验签以及数字信封加解密等功能的实施。该规范作为税务身份认证系统建设和运行...

    java获取数字证书信息

    ### Java 获取数字证书信息 在本篇文章中,我们将深入探讨如何使用Java来获取数字证书的信息,包括使用TOMCAT和JDK搭建SSL服务的过程、如何用OpenSSL签发证书以及如何支持第三方CA等内容。 #### 一、使用TOMCAT和...

    实训5:配置数字证书服务.docx

    配置数字证书服务 本资源摘要信息将详细介绍如何配置数字证书服务,包括在 DC 上部署企业根 CA、发布证书申请网站、设置证书颁发机构 Web 注册网站等内容。 一、在 DC 上部署企业根 CA 在 DC 上部署企业根 CA 是...

    PKI/CA与数字证书技术大全

    标题"PKI/CA与数字证书技术大全"暗示了主题是关于公钥基础设施(Public Key Infrastructure, PKI)和认证授权机构(Certification Authority, CA),以及与之相关的数字证书技术。这是一套全面的资料,旨在帮助读者...

    C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密

    1:调用.NET2.0的MAKECERT创建含有私钥的数字证书,并存储到个人证书区; 2:将该证书导出为pfx文件,并为其指定一个用来打开pfx文件的password; 3:读取pfx文件,导出pfx中公钥和私钥; 4:用pfx证书中的公钥进行...

    代码签名数字证书(含私钥)_过期证书_过期数字签名强制签名工具_数字签名_证书

    代码签名数字证书是软件开发和分发过程中一个关键的安全组件,尤其在确保用户信任和防止恶意软件方面。本文将深入探讨过期证书、过期数字签名的处理、强制签名工具以及数字签名证书的相关知识。 首先,我们要理解...

    数字证书基础.ppt

    【数字证书基础】\n\n数字证书是网络通信中安全性的基石,用于验证网络实体的身份。在电子交易、电子邮件和网络安全传输中,数字证书扮演着至关重要的角色。它结合了公钥加密技术和证书颁发机构(CA)的信任机制,...

    公钥私钥加密解密数字证书数字签名详解.docx

    ### 公钥私钥加密解密、数字证书与数字签名详解 #### 一、基础知识概述 在探讨公钥私钥加密解密、数字证书以及数字签名之前,我们需要先理解几个核心概念。 **1. 密钥对:** - 在非对称加密技术中,存在两种密钥...

Global site tag (gtag.js) - Google Analytics