`
阅读更多

数字证书。

    还有个问题,就是公钥问题,A用私钥加密了,那么B接受到消息后,用A提供的公钥解密;那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果……,这时候就需要一个中间机构出来说话了(相信权威,我是正确的),就出现了Certificate Authority(也即CA),有名的CA机构有Verisign等,目前数字认证的工业标准是:CCITT的X.509:

    数字证书:它将一个身份标识连同公钥一起进行封装,并由称为认证中心或 CA 的第三方进行数字签名。

    密钥库:java平台为你提供了密钥库,用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为 .keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。

    使用工具keytool,我们来做一件自我认证的事情吧(相信我的认证):

    1、创建密钥库keytool -genkey -v -alias feiUserKey -keyalg RSA 默认在自己的home目录下(windows系统是c:documents and settings<你的用户名> 目录下的。keystore文件),创建我们用 RSA 算法生成别名为 feiUserKey 的自签名的证书,如果使用了-keystore mm 就在当前目录下创建一个密钥库mm文件来保存密钥和证书。

    2、查看证书:keytool -list 列举了密钥库的所有的证书

    也可以在dos下输入keytool -help查看帮助。

    二、JAR的签名

    我们已经学会了怎样创建自己的证书了,现在可以开始了解怎样对JAR文件签名,JAR文件在Java中相当于 ZIP 文件,允许将多个 Java 类文件打包到一个具有 .jar 扩展名的文件中,然后可以对这个jar文件进行数字签名,以证实其来源和真实性。该 JAR 文件的接收方可以根据发送方的签名决定是否信任该代码,并可以确信该内容在接收之前没有被篡改过。同时在部署中,可以通过在策略文件中放置访问控制语句根据签名者的身份分配对机器资源的访问权。这样,有些Applet的安全检验访问就得以进行。

    使用jarsigner工具可以对jar文件进行签名:

    现在假设我们有个Test.jar文件(可以使用jar命令行工具生成):

    jarsigner Test.jar feiUserKey (这里我们上面创建了该别名的证书) ,详细信息可以输入jarsigner查看帮助

    验证其真实性:jarsigner -verify Test.jar(注意,验证的是jar是否被修改了,但不检验减少的,如果增加了新的内容,也提示,但减少的不会提示。)

    使用Applet中:<applet code="Test.class" archive="Test.jar" width="150" height="100"></applet>然后浏览器就会提示你:准许这个会话-拒绝-始终准许-查看证书等。

    三、安全套接字层(SSL Secure Sockets Layer)和传输层安全性(TLS Transport Layer Security)

    安全套接字层和传输层安全性是用于在客户机和服务器之间构建安全的通信通道的协议。它也用来为客户机认证服务器,以及(不太常用的)为服务器认证客户机。该协议在浏览器应用程序中比较常见,浏览器窗口底部的锁表明 SSL/TLS 有效:

    1)当使用 SSL/TLS(通常使用 https:// URL)向站点进行请求时,从服务器向客户机发送一个证书。客户机使用已安装的公共 CA 证书通过这个证书验证服务器的身份,然后检查 IP 名称(机器名)与客户机连接的机器是否匹配。

    2)客户机生成一些可以用来生成对话的私钥(称为会话密钥)的随机信息,然后用服务器的公钥对它加密并将它发送到服务器。服务器用自己的私钥解密消息,然后用该随机信息派生出和客户机一样的私有会话密钥。通常在这个阶段使用 RSA 公钥算法。

    3)客户机和服务器使用私有会话密钥和私钥算法(通常是 RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。

    java中javax.net.ssl.SSLServerSocketFactory类提供了一个很好的SSLServerSocker的工厂类,熟悉Socket编程的读者可以去练习。当编写完服务器端之后,在浏览器上输入https://主机名:端口 就会通过SSL/TLS进行通话了。注意:运行服务端的时候要带系统环境变量运行:javax.net.ssl.keyStore=密钥库(创建证书时,名字应该为主机名,比如localhost)和javax.net.ssl.keyStorePassword=你的密码

 

package com.ijo.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
import java.util.Date;

public class DigitalCertificate {
	public static void main(String[] args) {
		try {
			// 前提:将证书库中的一条证书导出到证书文件(我写的例子里证书文件叫TC.cer)
			// 从证书文件TC.cer里读取证书信息
			/*
			 * CertificateFactory cf = CertificateFactory.getInstance("X.509");
			 * FileInputStream in = new FileInputStream("C:/TC.cer");
			 * //将文件以文件流的形式读入证书类Certificate中 Certificate c =
			 * cf.generateCertificate(in);
			 * System.err.println("转换成String后的证书信息:"+c.toString());
			 */

			// 或者不用上面代码的方法,直接从证书库中读取证书信息,和上面的结果一摸一样
			String pass = "keystore";
			FileInputStream in2 = new FileInputStream("C:/BocsoftKeyLib");
			KeyStore ks = KeyStore.getInstance("JKS");
			ks.load(in2, pass.toCharArray());
			String alias = "TestCertification"; // alias为条目的别名
			Certificate c = ks.getCertificate(alias);
			System.err.println("转换成String后的证书信息:" + c.toString());

			// 获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法
			X509Certificate t = (X509Certificate) c;
			// 从信息中提取需要信息
			System.out.println("版本号:" + t.getVersion());
			System.out.println("序列号:" + t.getSerialNumber().toString(16));
			System.out.println("主体名:" + t.getSubjectDN());
			System.out.println("签发者:" + t.getIssuerDN());
			System.out.println("有效期:" + t.getNotBefore());
			System.out.println("签名算法:" + t.getSigAlgName());
			byte[] sig = t.getSignature();// 签名值
			PublicKey pk = t.getPublicKey();
			byte[] pkenc = pk.getEncoded();
			System.out.println("公钥:");
			for (int i = 0; i < pkenc.length; i++) {
				System.out.print(pkenc[i] + ",");
			}
			System.err.println();

			// 证书的日期有效性检查,颁发的证书都有一个有效性的日期区间
			Date TimeNow = new Date();
			t.checkValidity(TimeNow);
			System.out.println("证书的日期有效性检查:有效的证书日期!");

			// 验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书,比如:caroot.crt文件
			// 我手里没有CA颁给我的证书,所以下面代码执行不了
			/*
			 * FileInputStream in3=new FileInputStream("caroot.crt"); //获取CA证书
			 * Certificate cac = cf.generateCertificate(in3); //获取CA的公钥
			 * PublicKey pbk=cac.getPublicKey();
			 * //c为本地证书,也就是待检验的证书,用CA的公钥校验数字证书c的有效性 c.verify(pbk);
			 */

		} catch (CertificateExpiredException e) {// 证书的日期有效性检查:过期
			System.out.println("证书的日期有效性检查:过期");
		} catch (CertificateNotYetValidException e) { // 证书的日期有效性检查:尚未生效
			System.out.println("证书的日期有效性检查:尚未生效");
		} catch (CertificateException ce) {
			ce.printStackTrace();
		} catch (FileNotFoundException fe) {
			fe.printStackTrace();
		} /*
			 * catch (IOException ioe){ } catch (KeyStoreException kse){ }
			 */catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

分享到:
评论

相关推荐

    电信数智商用密码数字证书合格检测工具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