1.基础知识
1.1.公钥密码体制(public-key cryptography)
公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程如下:
加密:通过加密算法和公钥对内容(或说明文)进行加密,得到密文。加密过程需要用到公钥。
解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。
公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。
为保证私钥的安全性,一般把它保存在硬件密码设备中(如个人私钥可保存在USBKey或IC卡中,系统私钥可保存在加密机或加密卡中),且不让私钥导出硬件密码设备;通过口令、指纹等来访问控制该硬件密码设备。若把私钥保存在硬盘文件中,则要通过口令加密保护,但私钥文件易被复制。
为保证私钥的唯一性,可只允许在硬件密码设备内产生公私钥对,通过硬件技术确保私钥不能导出,然后只导出公钥提交CA中心签发数字证书。
1.2.对称加密算法(symmetric key algorithms)
加密和解密用的是同一个秘钥。
对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA等。
这类加密算法的优点就是计算量小、加密速度快、加密效率高;但是缺点也很明显,在传输数据前,双方必须商定并保存好秘钥,任何一方的秘钥被泄露,加密信息就不再安全了。另外,每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
密钥,一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。前面在公钥密码体制中说到的公钥、私钥就是密钥,公钥是加密使用的密钥,私钥是解密使用的密钥。
1.3.非对称加密算法(asymmetric key algorithms)
非对称加密需要两个秘钥来进行加密和解密,这两个秘钥非别是公有秘钥(公钥)和私有秘钥(私钥),公钥与私钥是一对,如果用公钥对数据进行加密,那么就必须用对应的私钥才能解密;同理,如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
RSA介绍
RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。
(公钥加密|私钥解密用于防止密文被破解、被第三方得到明文;私钥加密|公钥解密用于防止明文被篡改,确保消息的完整性和正确的发送方。那么既然为了防止明文被篡改,我们是不是直接都可以用公钥加密的方式呢,这样整串都是密文了,其实当然也可以,只不过签名的效率要高的多,而非对称加解密很费时间,所有对于不值得加密的非关键性数据,还是用签名合适)
非对称加密工作流程(如下图):
①首先乙生成一对公钥和私钥,自己保存好私钥,并将公钥向其他所有人公开;
②然后甲使用乙的公钥对原始数据进行加密,并将生成的密文发送给乙;
③乙接收到消息后用自己的私钥对密文进行解密,得到原始数据。
即使密文在传输过程中被截获了也没关系,因为别人根本不知道乙的私钥,所以无法解密。同理,如果乙要给甲回信,首先乙要得到甲的公钥,然后用甲的公钥对消息进行加密,发送给甲,甲用私钥进行解密。
这里有一个缺点:因为乙的公钥是公开的,所以有被人冒充甲方使用乙的公钥发送请求。
解决方案:首先甲用自己的私钥对消息进行加密,生成另一个密文,然后将密文发送给乙,乙收到消息之后,如果能用乙的公钥解密,就说明这个消息确实是甲方发送的。
2.数字签名
虽然上面的方法解决了身份认证的问题,但是由于所有人都有甲的公钥,所以只要消息发送中途被截获就一定能被解密;而且对文件加密可能是个耗时的过程,比如文件足够大,那么用私钥加密整个文件以及拿到文件后解密的开销无疑是巨大的。为了解决这两个问题,于是有了数字签名。
数字签名的发送流程如下:
①甲用hash函数对消息进行运算,得到hash值(h1),然后用甲的私钥对hash值进行加密,生成的密文我们叫他为数字签名;
②之后用乙的公钥对发送消息进行加密,生成密文叫secret;
③最后把密文和数字签名一起发给乙;
④乙收到后,首先用甲的公钥对数字签名进行解密,能解开说明消息确实是甲发送的,反之不是;
⑤然后乙用自己的私钥解读secret,并且用相同的hash函数对解密后的消息进行运算,得到一个hash值(h2),如果h1=h2,则说明消息没有被篡改,如果不等,则说明消息被篡改了。
有了数字签名,我们就可以验证来源和消息的完整性。但是仍然还存在缺陷。假如存在第三人丙,偷偷在乙的电脑用自己的公钥替换了甲的公钥,然后用自己的私钥给乙发送信息,这时乙收到的消息会以为是甲发送的。为了解决这个问题,于是有了数字证书。
3.数字证书
在说数字证书之前,我们首先要搞明白导致发生上面那种情况的根源在哪里?本质上来说就是乙无法区分电脑中公钥到底是谁的,以至于乙会把丙错当成甲,所以我们就要想办法给公钥做身份认证(数字证书),以便能让别人搞清楚公钥到底是谁的。有了数字证书后就可以用以下方式发送消息:
①首先甲去找"证书中心"(certificate authority,简称CA),为自己公钥做认证(就好比去公安局办身份证一样)。CA用自己的私钥对甲的公钥和一些其他信息进行加密,生成的东西就叫“数字证书”;
②甲给乙发送的消息如下:加密后的密文、甲的数字签名、甲的数字证书;
③乙收到消息后用CA的公钥解密甲的数字证书,拿到甲的公钥,然后验证甲的数字签名,后面流程和上面的一样。
如此一来问题就解决了,但是新的问题又出现了:每个人都有一个CA给颁发的数字证书,如果有一百万个人给乙发消息,那么乙就要保存一百万份不同的CA公钥来验证这些人的身份。显然这是不可能接受的,所以就有了“根证书”,里面存储CA公钥来验证所有CA分部颁发的数字证书,乙直接保存一份“根证书”就可以验证所有人的身份了。最后一点就是“根证书”的可靠性有谁来保证呢?确切的来说无法保证,就好像你自己无法证明你是你一样,“根证书”也是如此,只不过CA机构是获得社会绝对认可和有绝对权威的第三方机构,就像政府法院一样,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。
3.1证书构成
一个数字证书包含下面的具体内容:
证书的发布机构
证书的有效期
公钥
证书所有者(Subject)
签名所使用的算法
指纹以及指纹算法
数字证书可以保证数字证书里的公钥确实是这个证书的所有者(Subject)的,或者证书可以用来确认对方的身份。也就是说,我们拿到一个数字证书,我们可以判断出这个数字证书到底是谁的。
在windows下查看一个证书时,界面是这样的,我们主要关注一下Details Tab页,其中的内容比较长,我滚动内容后后抓了三个图,把完整的信息显示出来:
◆Issuer (证书的发布机构)
指出是什么机构发布的这个证书,也就是指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)。对于上面的这个证书来说,就是指“SecureTrust CA”这个机构。
◆Valid from , Valid to (证书的有效期)
也就是证书的有效时间,或者说证书的使用期限。过了有效期限,证书就会作废,不能使用了。
◆Public key (公钥)
在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的。这个数字证书的公钥是2048位的,它的值可以在图的中间的那个对话框中看得到,是很长的一串数字。
◆Subject (主题)
这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。对于这里的证书来说,证书的所有者是Trustwave这个公司。
◆Signature algorithm (签名所使用的算法)
就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名。
◆Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
这个是用来保证证书的完整性的,也就是说确保证书没有被修改过。其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。注意,这个指纹会使用“SecureTrust CA”这个证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起。
注意,为了保证安全,在证书的发布机构发布证书时,证书的指纹和指纹算法,都会加密后再和证书放到一起发布,以防有人修改指纹后伪造相应的数字证书。这里问题又来了,证书的指纹和指纹算法用什么加密呢?他们是用证书发布机构的私钥进行加密的。可以用证书发布机构的公钥对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他自己本身也有自己的证书。证书发布机构的证书是哪里来的呢???这个证书发布机构的数字证书(一般由他自己生成)在我们的操作系统刚安装好时(例如windows xp等操作系统),这些证书发布机构的数字证书就已经被微软(或者其它操作系统的开发机构)安装在操作系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了,并且设置为操作系统信任的数字证书。这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名。
由此可见,数字证书集合了多种密码学的算法:
自身带有公钥信息,可以完成相应的加密和解密操作;
同时还带有数字签名,可以鉴别消息的来源;
并且自身带有消息摘要信息,可以验证证书的完整新;
由于证书本身还有用户身份信息,因而具有认证性。
数字证书中常用的非对称加密算法是RSA算法,签名算法是SHA1withRSA算法,消息摘要算法是SHA1算法。
数字证书类似生活中的身份证,只是数字证书是签发给网络用户(计算机)的身份凭证。并且这些身份凭证需要有认证机构(Certificate Authority)CA签发,并且只有经过CA签发的证书在网络中才具有可认证性。
3.2.证书管理
要获得数字证书,我们需要使用数字证书管理工具(KeyTool或者OpenSSL)构建CSR(certificate signing request,数字证书申请),交由CA机构签发,形成最终的设资证书。
KeyTool证书管理
keyTool是Java中数字证书管理的工具,用于数字证书的申请、导入、导出和撤销等操作。KeyTool和本地密匙库相关联,将私钥存于密匙库,公钥则以数字证书输出。这个工具位于%JDK_HOME%/bin目录中。需要通过控制台命令行操作。(关于这部分操作请看博文)
OpenSSL证书管理
OpenSSL是一个开放源代码的软件包,这个是实现了SSL及相关加密技术,也是常用的证书管理工具,OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理,相关的操作可以参考官方文档。
参考文献:
https://blog.csdn.net/kswkly/article/details/83617944
https://blog.csdn.net/ly131420/article/details/38400583
https://blog.csdn.net/weixin_40792878/article/details/84489448