数字证书就是网络通讯中标志通讯各方身份信息的一系列数据,其作用类似于现实生活中的身份证。它是由一个权威机构发行的,人们可以在互联网上用它来识别对方的身份。
证书的格式遵循ITUTX.509国际标准
一个标准的X.509数字证书包含以下一些内容:
证书的版本信息;
证书的序列号,每个证书都有一个唯一的证书序列号;
证书所使用的签名算法;
证书的发行机构名称,命名规则一般采用X.500格式;
证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
证书所有人的名称,命名规则一般采用X.500格式;
证书所有人的公开密钥;
证书发行者对证书的签名。
1.密码学
在密码学中,有一个五元组:{明文、密文、密钥、加密算法、解密算法},对应的加密方案称为密码体制(或密码)。
明文:是作为加密输入的原始信息,即消息的原始形式所有可能明文的有限集称为明文空间。
密文:是明文经加密变换后的结果,即消息被加密处理后的形式,所有可能密文的有限集称为密文空间。
密钥:是参与密码变换的参数,一切可能的密钥构成的有限集称为密钥空间。
加密算法:是将明文变换为密文的变换函数,相应的变换过程称为加密,即编码的过程。
解密算法:是将密文恢复为明文的变换函数,相应的变换过程称为解密,即解码的过程。
对称算法:
加密和解密使用同一密钥
主要算法包括:DES、3DES、RC2、RC4
加/解密速度快,但密钥分发问题严重
非对称算法:
不需要首先共享秘密
两个密钥同时产生:一把密钥(公钥)是公开的,任何人都可以得到。另一把密钥(私人密钥)只有密钥的拥有者知道。
用其中一把密钥(公钥或者是私钥)加密的信息,只能用另一把打开。
RSA算法,ECC(椭圆曲线)算法
由已知的公钥几乎不可能推导出私钥
强度依赖于密钥的长度
很慢-不适合加密大数据
公钥可以广泛地、开放地分发
用于加密,签名/校验,密钥交换
数字摘要:
把可变输入长度串转换成固定长度输出串的一种函数。称输出串为输入串的指纹,或者数字摘要;
不同明文的摘要相同的概要是非常非常小的;而同样明文其摘要必定一致;
明文的长度不固定,摘要的长度固定。
没有密钥
不可回溯
典型算法:MD5,SHA-1
用于完整性检测,产生数字签名
最好的解决方案:
使用对称算法加密大的数据
每次加密先产生新的随机密钥
使用非对称算法交换随机产生的密钥
用非对称算法做数字签名(对散列值即摘要做数字签名)
四条基本规则
先签名,然后加密
加密之前先压缩
用你自己的私钥做签名
用接收者的公钥做加密
加密:
解密:
怎样解决4个通讯安全需求?
私密性 加密
完整性 ?
不可否认性 ?
身份认证 ?
数字签名
数字签名采用公钥体制(PKI),即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过这种手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的1024位RSA密钥,需要上千年的计算时间。公开密钥技术解决了密钥发布的管理问题,商户可以公开其公开密钥,而保留其私有密钥。购物者可以用人人皆知的公开密钥对发送的信息进行加密,安全地传送给商户,然后由商户用自己的私有密钥进行解密。
用户也可以采用自己的私钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别人无法生成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点:
(1)保证信息是由签名者自己签名发送的,签名者不能否认或难以否认;
(2)保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。
数字签名具体做法是:
(1)将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。
(2)将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名。这样就保证了签发者不可否认性。
(3)接收方收到数字签名后,用同样的HASH算法对报文计算摘要值,然后与用发送者的公开密钥进行解密解开的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。
数字证书是如何生成的?
数字证书是数字证书在一个身份和该身份的持有者所拥有的公/私钥对之间建立了一种联系,由认证中心(CA)或者认证中心的下级认证中心颁发的。根证书是认证中心与用户建立信任关系的基础。在用户使用数字证书之前必须首先下载和安装。
认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更高级别的认证中心提供一个电子凭证来证明其公共密钥的有效性,后一种方法导致了多级别认证中心的出现。
数字证书颁发过程如下:用户产生了自己的密钥对,并将公共密钥及部分个人身份信息(称作P10请求)传送给一家认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内附了用户和他的密钥等信息,同时还附有对认证中心公共密钥加以确认的数字证书。当用户想证明其公开密钥的合法性时,就可以提供这一数字证书。
证书的产生:认证中心把用户证书的基本信息做哈希算法,然后用自己的私钥对哈希值进行加密。
五.数字证书是如何分发的?
CA将证书分发给用户的途径有多种。第一种途径是带外分发(Out-of-band Distribution),即离线方式。例如,密钥对是由软件运营商代替客户生成,证书也是由运营商代替客户从CA下载,然后把私钥和下载的证书一起储存在软盘里,再交给用户的。这样做的好处是免去了用户上网下载证书的麻烦。第二种途径是带内分发(In-band distribution),即用户从网上下载数字证书到自己的电脑中。下载时,用户要向CA出示“参考号”和“授权码”,以向CA证明自己的身份。这样做成本较低,但对使用计算机不太熟悉的用户来说,可能在下载时会碰到一些麻烦。除了以上两种方式外,CA还把证书集中放置在公共的数据库中公布,用户可以随用随查询随调用。
六.数字证书是如何存储的?
数字证书和私钥储存的介质有多种,大致分为硬证书和软证书。可以存储在计算机硬盘、软盘、智能卡或USB key里。
1、关于私钥的唯一性
严格地讲,私钥既然是世上唯一且只由主体本身持有,它就必须由主体的计算机程序来生成。因为如果在别处生成将会有被拷贝的机会。然而在实际应用上并非如此,出于某些特殊需要(例如,如果只有一份私钥,单位的加密文件就会因为离职员工带走 私钥而无法解密。)加密用的公/私钥对会要求在可信的第三方储存其备份。这样,加密用的私钥可能并不唯一。然而签名用的私钥则必须保持唯一,否则就无法保证被签名信息的不可否认性。
在生成用户的密钥对时,用于加密的公/私钥对可以由CA、RA产生,也可以在用户终端的机器上用专用的程序(如浏览器程序或认证软件)来产生。用于数字签名的密钥对原则上只能由用户终端的程序自行产生,才能保证私钥信息的私密性以及通信信息的不可否认性。
有人可能会产生疑问:有的加密和签名的密钥对都是由软件运营商代替客户生成的,这是否破坏了上述的私钥唯一性原则呢?答案是否定的。这时候,私钥的唯一性要依靠法律合同的保证以及操作过程中相应制度的约束,使得不可否认性得到支持。出于这种机制,我们仍然可以认为,用户的签名私钥是唯一的。
2、证书,私钥,到底保护哪一个?
我们常常听到有人说:“保管好你的软盘,保管好你的KEY,不要让别人盗用你的证书。”有些教科书上也这样讲。应该说,这句话是有毛病的。数字证书可以在网上公开,并不怕别人盗用和篡改。因为证书的盗用者在没有掌握相应的私钥的情况下,盗用别人的证书既不能完成加密通信,又不能实现数字签名,没有任何实际用处。而且,由于有CA对证书内容进行了数字签名,在网上公开的证书也不怕黑客篡改。我们说,更该得到保护的是储存在介质中的私钥。如果黑客同时盗走了证书和私钥,危险就会降临。
七.如何验证数字证书?
以Alice验证Bob证书为例:
校验Bob的证书的合法性
(1)Alice获得Bob的证书和签发Bob证书的CA的证书
(2)用CA的公钥解密Bob的证书摘要
(3)计算Bob的证书的摘要
(4)比较这两个摘要
(5)校验Bob的证书证书有效期
(6)校验签发者签名(证书链)
(7)检查证书作废列表(CRL,OCSP)
八.CRL和OCSP是什么?
证书的有效性取决于两个方面因素:第一个因素是证书有效期:证书的有效期在证书被颁发之日就已经确定了,例如CFCA(中国金融认证中心)规定个人证书的有效期是一年(可扩展),企业证书的有效期是三年。证书的有效期(Validity Period)作为一项内容被写进了数字证书之中,它用两个日期——证书开始生效的日期和证书失效的日期来表示。显然,已经过了有效期的证书不能通过验证。
证书有效期的设定是出于安全的考虑,当一张证书有效期将结束时,如果想继续使用就需要更新,证书更新时将产生新的公私密钥对,密钥定期更新对于证书的安全性是有好处的。
第二个因素是证书注销:虽然证书有效期没有过,但是如果发生了特殊情况,例如用户发现证书遗失或私钥失密,用户会向CA/RA提出注销证书的申请,CA/RA经过审核后将实施证书注销。那么,被注销的证书也不能通过验证。 第一种情况比较简单,证书的有效期就写在了证书之中,安全认证应用软件只要调出证书的内容,判断一下就知道这张数字证书当前是否还在有效期内。 第二种情况则比较复杂,证书一旦发出,是不可能收回的。怎么办呢?只能申请注销。所谓注销,就是要求当初颁发这张证书的单位(CA)出一张告示,宣布某张证书已经被注销作废,警告有关的交易者注意,不要再使用与这张证书绑定的公钥。在PKI安全认证体系中,这种“告示”称为证书注销列表(或证书撤销清单、证书注销清单、证书废止列表等),英文原文是Certificate Revocation List,缩写为CRL。 对于第二种情况,安全认证应用软件在验证证书的有效性时就需要去访问证书注销列表(CRL)。这个列表相当于“黑名单”,一旦发现通信对方的证书在这张列表中,就不能通过验证。 证书注销机制可以防止证书遗失或发现私钥失密后,不法分子冒用用户证书、私钥实行欺诈交易所带来的损失。这和信用卡注销、有效证件注销的机制十分类似。 注销证书的其他原因还包括:银行方面认为证书用户信用丧失、用户身份姓名发生改变、用户从他所属单位离职、岗位和职权发生变更等情况。
CRL的内容
根据X.509标准,CRL的内容和数据结构定义如所示:
版本
签名算法
签发者
更新时间
下一次更新时间
废止的证书列表
用户证书序列号
废止时间
CRL入口扩展
CRL的内容包括CRL的版本号、计算本CRL的数字签名所用的算法的标识符(如加密算法RSA、数字摘要算法MD5等算法的标识符)、颁发CRL的CA的可识别名(DN)、CRL的发布/更新时间、被注销证书的列表(仅列出被注销证书的唯一序列号)以及扩展项。
扩展项中的内容有:
(1)理由代码——指出该证书被注销的理由,如:密钥损坏、CA损坏、关系变动、操作终止等;
(2)证书颁发者——列出该证书颁发者的名字;
(3)控制指示代码——用于证书的临时冻结;
(4)失效日期——列出该证书不再有效的日期。 为了保证CRL的真实性和完整性,CRL数据的后面附有颁发CRL的CA对CRL的数字签名。
九.常见的数字证书格式
1.在Security编程中,有几种典型的密码交换信息文件格式:
DER-encoded certificate: .cer, .crt
PEM-encoded message: .pem
PKCS#12 Personal Information Exchange: .pfx, .p12
PKCS#10 Certification Request: .p10
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b
.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
2.数字证书文件格式(cer和pfx)的区别
作为文件形式存在的证书一般有这几种格式:
1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以
pfx作为证书文件后缀名。
2.二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
3.Base64编码的证书
证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。 由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。
如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。
如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密
3.X.509定义了两种证书:公钥证书和属性证书
PKCS#7和PKCS#12使用的都是公钥证书
PKCS#7的SignedData的一种退化形式可以分发公钥证书和CRL
一个SignedData可以包含多张公钥证书
PKCS#12可以包含公钥证书及其私钥,也可包含整个证书链
十.数字证书命名
C(county) 国家
O(organization)颁发机构名称
OU(Organizational Unit) 组织单位名称
CN (common name) 持有者的名称
例如:CN=zhangsan,OU=beijingICBCbank,O=ICBCbank
十一.证书工具使用
1.KeyTool工具
Java自带的keytool工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。
Java KeyStore的类型
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型(我所知道的共有5种,JKS, JCEKS, PKCS12, BKS,UBER)。
JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。
JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDes)。
PKCS#12是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在 windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。
BKS 来自BouncyCastle Provider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个 bit都会产生错误),BKS能够跟JKS互操作,读者可以用Keytool去TryTry。UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。以前,Sun JDK(提供者为SUN)允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。