- 浏览: 359430 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
missfmaster:
这框架好特么底层。
Terracotta设计原理分析--(部分内容来自官方描述) -
小黄牛:
很好不错!分享一个在电商购物支付流程中,在各大参与者系统中可能 ...
分布式事务设计-两段式提交 -
zhglhy:
学习了,感谢分享
JAVA垃圾回收分析 -
talentluke:
如果在事务一中出现故障,数据库是可以回滚但消息队列不能回滚,队 ...
用消息队列和消息应用状态表来消除分布式事务(转载) -
langmanxingkong123:
谁说jedis不能存集合类的数据。乱说。。。
redis jredis jedis 使用
原理基础
数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体,依靠数字证书,我们可以构建一个简单的加密网络应用平台,数字证书就好比我们生活中的身份证,现实中,身份证由公安机关签发,而网络用户的身份凭证由数字证书颁发认证机构—CA签发,只有经过CA签发的证书在网络中才具备可认证性,CA并不是一个单纯的防御手段,它集合了多种密码学算法:
消息摘要算法:MD5、和SHA(对数字证书本省做摘要处理,用于验证数据完整性服务器)
对称加密算法:RC2、RC4、IDEA、DES、AES(对数据进行加密/解密操作,用于保证数据保密性服务)
非对称加密算法:RSA、DH(对数据进行加密/解密操作,用于保证数据保密性服务)
数字签名算法:RSA、DSA(对数据进行签名/验证操作,保证数据的完整性和抗否认性)。
证书的签发过程实际上是对申请数字证书的公钥做数字签名,证书的验证过程实际上是对数字证书的公钥做验证签名,其中还包含证书有效期验证,通过CA数字证书,我们对网络上传输的数据进行加密/解密和签名/验证操作,确保数据机密性、完整性、抗否认性、认证性,保证交易实体身份的真实性,保证网络安全性。
所有证书有多种文件编码格式,主要包括:
CER编码(规范编码格式):是数字证书的一种编码格式,它是BER(基本编码格式)的一个变种,比BER规定得更严格
DER(卓越编码格式):同样是BER的一个变种,与CER的不同在于,DER使用定长模式,而CER使用变长模式。
所有证书都符合公钥基础设施(PKI)制定的ITU-T X509国际标准,PKCS(公钥加密标准)由RSA实验室和其他安全系统开发商为促进公钥密码的发展而制定的一系列标准,比如:PKCS#7(密码消息语法标准----文件后缀名:.p7b、.p7c、.spc)、PKCS#10(证书请求语法标准----文件后缀名:.p10、.csr)、PKCS#12(个人信息交换语法标准----文件后缀名:.p12、.pfx)等
在获得数字证书后,可以将其保存在电脑中,也可以保存在USB Key等相应的设备中。
我们先来看一个简单的证书机构签发的流程:
这里的认证机构如何是证书申请者本身,将获得自签名证书。
当客户端获得服务器下发的数字证书后,即可使用数字证书进行加密交互:
数字证书的应用环境是在https安全协议中,使用流程远比上述加密交互流程复杂,但是相关操作封装在传输层,对于应用层透明,在https安全协议中使用非对称加密算法交换密钥,使用对称加密算法对数据进行加密/解密操作,提高加密/解密效率
要获得数字证书,我们需要使用数字证书管理工具:KeyTool和OpenSSL构建CSR(数字证书签发申请),交由CA机构签发,形成最终的数字证书,这里我们不对KeyTool做讲解(KeyTool不含有根证书,因此KeyTool没有办法作为CA),网上资料对keytool讲解的也挺多的,我们下面针对OpenSSL进行讲解。
在我们搭建OPEN SSL环境前,我们要知道HTTPS协议和SSL/TLS协议,简单的说,HTTPS就是HTTP+SSL(secure socket layer)/TLS(Transport Layer Security)协议,HTTPS协议为数字证书提供了最佳的应用环境,HTTPS协议一般在服务器中配置,如HTTP服务器APACHE、TOMCAT等。
SSL:位于TCP/IP中的网络传输层,作为网络通讯提供安全以及数据完整性的一种安全协议
TLS:作为SSL协议的继承者,成为下一代网络安全性和数据完整性安全协议
SSL共有3个版本:1.0、2.0、3.0,TLS也有1.0、2.0、3.0,通常我们说的SSL/TLS协议指的是SSL3.0/TLS1.0的网络传输层安全协议
SSL/TLS协议分为两层:
记录协议:建议在可靠的传输协议之上,为高层协议提供数据封装、压缩、加密等基本功能的支持
握手协议:建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
经过了SSL/TLS握手协议交互后,数据交互双方确定了本次会话使用的对称加密算法以及密钥,就可以开始进行加密数据交互了,以下是握手协议服务器端和客户端构建加密交互的相关流程图:
协商算法
1、 随机数为后续构建密钥准备
2、 其他信息包括服务器证书、甚至包含获取客户端证书的请求
验证算法
如果服务器端回复客户端时带有其他信息,则进入数字证书验证阶段
客户端验证服务器端证书:
服务器端验证客户端证书:
产生密钥
当服务器端和客户端经过上述流程后,就开始密钥构建交互了,服务器端和客户端最初需要主密钥为构建会话密钥做准备:
上述5、6不存在次序关系,因为是异步完成
会话密钥
完成上述主密钥构建操作后,服务器端和客户端将建立会话密钥,完成握手协议:
加密交互
上述服务器端和客户端完成了握手协议以后就进入正式会话阶段,如果上述流程中有任何一端受到外界因素干扰发生异常,则重新进入协商算法阶段,下面流程表现进入会话阶段后,服务器端和客户端将使用会话密钥进行加密交互:
代码解释
在JAVA 6 以上版本中提供了完善的数字证书管理的实现,我们不需要关注相关具体算法,仅通过操作密钥库和数字证书就可以完成相应的加密/解密和签名/验证操作,密钥库管理私钥,数字证书管理公钥,私钥和密钥分属消息传递两方,进行加密消息的传递。
因此,我们可以将密钥库看做私钥相关操作的入口,数字证书则是公钥相关操作的入口:
/**** * 获得私钥,获得私钥后,通过RSA算方法实现进行"私钥加密,公钥解密"和"公钥加密,私钥解密"操作 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return 私钥 */ private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias,String password)throws Exception{ //获得密钥库 KeyStore ks = getKeyStore(keyStorePath,password); //获得私钥 return (PrivateKey)ks.getKey(alias, password.toCharArray()); } /**** * 由Certificate获得公钥,获得公钥后,通过RSA算方法实现进行"私钥加密,公钥解密"和"公钥加密,私钥解密"操作 * @param certificatePath 证书路径 * @return 公钥 */ private static PublicKey getPublicKeyByCertificate(String certificatePath)throws Exception { //获得证书 Certificate certificate = getCertificate(certificatePath); //获得公钥 return certificate.getPublicKey(); } /**** * 加载数字证书,JAVA 6仅支持x.509的数字证书 * @param certificatePath 证书路径 * @return 证书 * @throws Exception */ private static Certificate getCertificate(String certificatePath) throws Exception{ //实例化证书工厂 CertificateFactory certificateFactory = CertificateFactory.getInstance("x.509"); //取得证书文件流 FileInputStream in = new FileInputStream(certificatePath); //生成证书 Certificate certificate = certificateFactory.generateCertificate(in); //关闭证书文件流 in.close(); return certificate; } /**** * 获得Certificate * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return 证书 * @throws Exception */ private static Certificate getCertificate(String keyStorePath,String alias,String password) throws Exception{ //由密钥库获得数字证书构建数字签名对象 //获得密钥库 KeyStore ks = getKeyStore(keyStorePath,password); //获得证书 return ks.getCertificate(alias); } /**** * 加载密钥库,加载了以后,我们就能通过相应的方法获得私钥,也可以获得数字证书 * @param keyStorePath 密钥库路径 * @param password 密码 * @return 密钥库 * @throws Exception */ 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; } /**** * 私钥加密 * @param data 待加密的数据 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return 加密数据 * @throws Exception */ public static byte[] encryptByPriateKey(byte[] data,String keyStorePath,String alias,String password) throws Exception{ //获得私钥 PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,password); //对数据加密 Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm()); return cipher.doFinal(data); } /**** * 私钥解密 * @param data 待解密数据 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return 解密数据 * @throws Exception */ 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); } /**** * 公钥加密 * @param data 等待加密数据 * @param certificatePath 证书路径 * @return 加密数据 * @throws Exception */ 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); } /**** * 公钥解密 * @param data 等待解密的数据 * @param certificatePath 证书路径 * @return 解密数据 * @throws Exception */ 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); } /**** * @param sign 签名 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return 签名 * @throws Exception */ 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(); } /**** * 验证签名 * @param data 数据 * @param sign 签名 * @param certificatePath 证书路径 * @return 验证通过为真 * @throws Exception */ 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); } //我们假定密钥库文件yale.keystore存储在D盘根目录,数字证书文件yale.cer也存储在D盘根目录 /**** * 公钥加密---私钥解密 * @throws Exception */ public static 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.err.println("加密前:\n" + inputStr); System.err.println("解密后:\n" + outputStr); } /**** * 私钥加密---公钥解密 * @throws Exception */ public static void test2()throws Exception{ System.err.println("私钥加密---公钥解密"); String inputStr = "数字签名"; byte[] data = inputStr.getBytes(); //私钥加密 byte[] encodedData = CertificateCoder.encryptByPriateKey(data, keyStorePath, alias, password); //公钥加密 byte[] decodeData = CertificateCoder.decryptByPublicKey(encodedData, certificatePath); String outputStr = new String (decodeData); System.err.println("加密前:\n" + inputStr); System.err.println("解密后:\n" + outputStr); } public static 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); }
发表评论
-
王者荣耀是用什么语言开发的!
2020-10-29 19:24 12072017年什么最火? 不用问,肯定是人人都“ ... -
王者荣耀是用什么语言开发的!
2020-10-29 19:04 02017年什么最火? 不用问,肯定是人人都在撸的“王 ... -
用消息队列和消息应用状态表来消除分布式事务(转载)
2012-11-21 11:12 3333由于数据量的巨大,大 ... -
CA认证原理以及实现(下)
2012-09-10 20:38 17061在上述的文章后了解到原理之后,我们这篇文章来进行CA的搭建。 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(下)
2012-06-28 21:58 1482云管理平台云是IT实现,是造出来的,不是买来的。我们可以买服务 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(上)
2012-06-28 21:08 1683云之所以热,是因为现在以及未来市场的业务推动力(回报率),现在 ... -
Terracotta Server[兵马俑]集群
2012-06-14 01:23 10809Terracotta的介绍以及原理在我之前的文章中已经做了相关 ... -
Local Cache + Server Cache
2012-05-27 00:01 785其实下面说的一些设计思路来源于一些开源的缓存软件,比如Ehca ... -
Web请求-异步模式
2012-05-26 22:45 268Comet技术已经不算是 ... -
分布式事务设计-三段式提交
2012-05-25 20:24 5544前面的文章提到的两段 ... -
分布式事务设计-两段式提交
2012-02-08 17:16 14217事务是一个很重要的概念,它必须满足ACID特性,在单机的数据库 ... -
架构设计要“注意点”
2011-09-08 14:24 370资源有限注意点:系统设计的时候总是估摸不到会有大数据量从远端传 ... -
替代分布式事务策略
2011-06-10 19:59 2246由于数据量的巨大,现 ... -
你符合成为一个架构设计师的特征吗?
2011-03-30 12:28 557其实想写这篇文章也是 ... -
缓存客户端集群
2011-03-18 17:12 1670Memcached Cache是集中式Cach ... -
Netlog中数据库演变过程
2011-03-18 15:45 476Netlog拥有4000万活跃用户,每个月有超过5000万的独 ... -
如何检测一台机器是否宕机?(转载)
2011-03-15 20:19 1763检测一台机器是否宕机 ... -
淘宝OceanBase设计(转载)
2011-03-14 16:26 1372OceanBase有什么特点 ... -
EhCache辅助spring Acegi
2010-09-14 16:36 2141因为在项目中想通过缓存来acegi的整合,因此选用了Ehcac ... -
Facebook运用软件
2010-08-12 15:51 16752010年6月,Facebook现在的经营规模,诸多传统服务器 ...
相关推荐
下面我们将深入探讨CA工作原理以及其在机顶盒中的应用。 首先,CA系统的核心组成部分包括智能卡(Smart Card)和 Conditional Access Module(CAM,条件接收模块)。智能卡是一种含有微处理器和存储器的卡片,用于...
实验目的旨在让学生了解 PKI 体系、用户证书申请和 CA 颁发证书过程、认证服务的安装及配置方法、使用数字证书配置安全站点的方法、使用数字证书发送签名邮件和加密邮件的方法。 一、实验目的 本实验的目的是验证...
这个压缩包很可能是为了介绍或实现RSA大数据算法在CA认证过程中的应用。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前最广泛使用的公钥加密技术之一。它的核心原理是...
本文利用Java技术实现客户端数字证书的签名和验证,关键在于理解数字签名的工作原理。数字签名是使用发送者的私钥对消息或文档进行加密的一种方式,接收者或其他人可以使用发送者的公钥来验证签名。这个过程确保了...
实现基于SSL的身份认证和访问控制的原理,实际上是建立在网络通信双方之间的安全信任机制之上。通过技术手段确保身份的真实性和信息传输的机密性、完整性和不可否认性,再通过不同的授权和认证方法实现细粒度的访问...
一、CA认证的基本原理 CA认证基于公钥基础设施(PKI,Public Key Infrastructure)体系,通过一对非对称密钥进行数据加密和解密。每个用户拥有一对密钥,一把是私钥,用于解密和签名;另一把是公钥,用于加密和验证...
CA电子认证服务系统是用于确保网络通信安全的...这些源代码对于理解和学习CA系统的工作原理,以及自定义和扩展认证服务非常有价值。开发者可以通过深入研究源代码,了解如何实现一个符合国际标准的电子认证服务系统。
在Linux环境下搭建一个自定义的CA认证服务器不仅可以帮助我们更好地理解PKI(Public Key Infrastructure,公钥基础设施)的工作原理,还能为内部网络环境提供一种高效且经济的认证机制。本文将详细介绍如何在Linux...
PKI公钥基础和CA原理 PKI(Public Key Infrastructure)公钥基础设施是指使用非对称密码算法原理和技术来实现并提供安全服务的具有通用性的安全基础设施。它是一种遵循标准的利用公钥加密技术为电子商务的开展提供...
本篇文章将深入探讨如何在Android应用中实现对自签CA的HTTPS SSL双向认证,并且这些实现方法同样适用于Java SE(J2SE)环境。 首先,我们需要了解HTTPS的基本原理。HTTPS是HTTP协议的安全版本,它通过SSL/TLS协议来...
本资料主要围绕PKI的理论基础、实现原理以及编程应用进行深入探讨。 在第2章中,我们通常会学习到PKI的基本概念和原理,包括公钥和私钥的概念,非对称加密算法如RSA、ECC的工作方式,以及证书的结构和作用。这一章...
通过对这些代码的分析和学习,可以更好地理解 Netty 中的 SSL/TLS 双向认证工作原理。 总结,Netty 提供了强大而灵活的工具来实现 SSL/TLS 安全通信,包括双向认证。通过正确配置 `SslContext`、处理通道处理器和...
【标题】中的“精品软件工具--简单的CA认证系统软件大型实验周的作品”表明这是一个用于学习或教学目的的软件项目,其主要功能是实现一个基础的证书权威(CA)系统。CA在信息技术领域中扮演着至关重要的角色,它负责...
通过数字证书,我们可以实现安全的数据传输、身份认证以及数字签名等功能。随着信息技术的发展,数字证书的应用越来越广泛,从电子商务、金融交易到政府服务等多个领域都离不开数字证书的支持。理解数字证书的工作...
最后,整个双向CA系统的设计充分考虑了与第三方系统的兼容性、扩展性以及易用性,可以为运营商提供增值业务的支撑,并且在用户体验和安全性方面都较传统的单向CA系统有了显著的提升。系统通过灵活的设计和高效的数据...
标题"PKI/CA与数字证书技术大全"暗示了主题是关于公钥基础设施(Public Key Infrastructure, PKI)和认证授权机构(Certification Authority, CA),以及与之相关的数字证书技术。这是一套全面的资料,旨在帮助读者...
CA(Certificate Authority)证书认证系统是密码学中的关键组成部分,用于建立网络上的信任关系,确保通信的安全性。在这个实验中,学生将有机会实际操作并理解这一系统的工作原理。 首先,CA证书认证系统是基于...
在IT行业中,CA(Certification Authority)通常指的是认证权威机构,它在网络安全中扮演着重要角色,用于发放和管理数字证书。RA(Registration Authority)则是注册权威,是CA的一个组成部分,负责用户身份验证和...