`
阅读更多

数字证书。

    还有个问题,就是公钥问题,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证书规范,至此,商密算法的数字证书在商用密码应用安全性评估中成为了必须要检测的一个重要环节...

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

    本规范规定了税务系统数字证书应用接口,包括客户端调用用户密码设备(如USBKEY)接口和应用服务器端调用签名及认证服务器接口,为完整实现税务系统数字证书身份认证、签名验签、数字信封加解密等应用功能提供接口。...

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

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

    GM/T 0014-2012 数字证书认证系统密码协议规范.pdf

    本标准是为我国信息安全基础设施建设中关于数字证书认证系统密码协议...实体对数字证书认证系统的真实性、保密性、完整性、可认证性和不可否认性等安全需求。 本标准凡涉及密码算法相关内容,按照国家有关法规实施。

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

    实验二 数字证书应用 数字证书实验详细步骤原理 利用数字证书建立安全Web通信 利用数字证书实现电子邮件安全

    支付宝数字证书助手支付宝数字证书助手

    支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手支付宝数字证书助手

    数字证书技术大全

    所有与数字证书相关的各种概念和技术,统称为PKI( Public Key Infrastructure 公钥基础设施),为解决公钥与用户映射关系问题,PKI引入了数字证书。数字证书里包含了用户身份信息,用户公钥信息(两者用于确定用户...

    java获取数字证书信息

    使用TOMCAT和JDK搭建SSL服务, JAVA获取数字证书项, 如何用OPENSSL签发证书, 支持第三方CA

    vs2017数字证书certificates.rar

    vs2017数字证书certificates安装

    数字签名和数字证书

    用图文的方式对数字签名和数字证书之间的关系进行一个详细说明、希望大家看后恍然大悟。我目前正在用C#做证书和签名这块,但进展十分不畅,如果哪位朋友有好的方法或者示例,请私信联系

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

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

    粤港跨境数字证书认证技术研究

    ca 数字证书 粤港跨境研究资料 针对粤港两地政策法规未完全规范,以及两地数字证书认证机构(CA)在认证业务声明和证书策略两方面存在差异 的问题,分析目前跨域公钥基础设施信任架构,提出一种针对当前两地政策法规未...

    广州数字证书驱动64位

    官方网站上的下载没有该证书,是找服务人员要到的,可解决64位操作系统不能识别数字证书的问题。温馨提示,此驱动是明华Ukey版本

    ZXCA自信数字证书制作工具

    制作符合国际标准的数字证书和应用数字证书进行文件保密的工具集合,还有用于代码签名的辅助工具,适用于个人或小企业、小团体内部使用。短小精简,绿色免安装,是学习、掌握数字证书应用的最佳实践工具。

    信息安全大作业-CA系统的设计和实现源码(电子认证服务系统-数字证书数字签名python语言)+项目详细说明.7z

    信息安全大作业_CA系统的设计和实现源码(电子认证服务系统_数字证书数字签名python语言)+项目详细说明.7z CA代表Certificate Authority。也就是电子认证服务或机构,为电子签名相关各方提供真实性和可靠性验证,是...

    02 电子政务数字证书应用接口规范——国密局2010-08.pdf

    为了规范电子政务数字证书应用,提升数字证书的应用价值,本规范定义了证书应用的环境函数、 证书解析函数、随机数函数、签名验证函数、加解密函数、时间戳函数以及数据服务函数u通过以上 函数的定义,可以提供完菩...

    golang解析数字证书

    golang解析数字证书 PKCS#1 PKCS#8格式的私钥

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

    从网络上找到这PKI/CA与数字证书技术大全和PKI原理与技术两部分内容,汇总一下,供大家一起学习PKI相关知识

    在WEB应用中使用基于数字证书的登录验证

    在WEB应用中使用基于数字证书的登录验证

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

    国密数字证书验证、SM2椭圆曲线公钥密码算法、SM2椭圆曲线公钥密码算法推荐曲线参数、SM3密码杂凑算法、SM4分组密码算法、国密数字证书验证方法、使用国密算法的数字证书的验证签名的详细例子

Global site tag (gtag.js) - Google Analytics