Linux学习67 运维安全-通信公钥、私钥管理及CA机构讲解
一、加密算法和协议(续)
1、对称加密(见上集)
2、公钥加密
a、密钥分为公钥与私钥
(1)、加密数据时:加密数据时用公钥解密数据时只能用私钥。
(2)、解密数据时:加密时用私钥解密时用公钥
b、公钥:从私钥中提取产生,可公开给所有人,称为pubkey
c、私钥:通过工具创建,使用者自己留存,必须保证其私密性。secret key
d、特点:用公钥加密的数据只能使用与之配对的私钥解密,反之亦然
e、用途:
(1)、数字签名:主要在于让接收方确认发送方的身份
(2)、密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方以实现密钥交换
(3)、数据加密
3、公钥加密原理
a、我们假设图中左边图形为公钥,正方形为私钥。公钥加密有两种作用,私钥是自己留存的,公钥是可以公开给任何人的,但是公钥和私钥都能用于实现加密和解密。于是就有两种发送方式,第一种是通信的一方,我们姑且称之为Bob,另一个我们称之为Alice。Bob可以拿着Alice的公钥加密一段数据发送给Alice,这个时候用Alice的公钥加密的数据Alice的私钥能解密。此时只有Alice自己一个人有他的私钥。假如此时还有一个家伙叫Eve对他们之间的数据传输虎视眈眈,每天监听着他们的通信。然后Bob用Alice公钥加密后的数据传输给Alice,然后这份数据被Eve获取了,此时Eve是没法解密的,因为他没有Alice的私钥。
b、反过来,如果Alice用自己的私钥加密数据然后发送给Bob,此时Eve得到了这个数据,Eve就能解密这个数据了,因为这份数据可以用Alice的公钥进行解密,而Alice的公钥又是公开的,因此就可以解密这个数据了。此时我们的数据保密性就是这样了:如果用Alice的公钥能解密,那么这一定是Alice发的,因为只有Alice才有他自己的私钥,只有她才能用自己的私钥加密,而反之我们就可以认为只要用Alice的公钥能解密那么他一定就算Alice生成的,除非他的私钥丢了。因此我们这个加密功能至少能验证这个数据是Alice发送的,我们得到了发送者身份的验证。
c、公钥作用中的数字签名:这个功能就是验证发送者身份的。但是我们像上面所说我们要验证身份就加这么大一段数据是不明智的,因为公钥加密比对称加密要慢的多的多,比如我们要发送一个2G的电影,我们要对这2G的数据进行加密和解密都是一个极大的挑战。因此一般来讲我们为了做身份认证我们是不会让发送者去加密整段数据,而只是把这整个数据的特征码给提取出来。比如你使用MD5算法或者sha512算法计算出你要发送的数据的特征码,我们又说过单向加密算法有一个特性是定长输出,也就是说无论原始数据有多大他的结果都很小,比如md5只有128位的输出,sha1是160位的输出。因此Alice会将数据和加密后的特征码一并发给Bob,Bob拿到数据以后他不能轻信这里面的数据是没问题的,第一步他会先用Alice的公钥去解密这段特征码,只要能解密的话那么一定是Alice发的这个毋庸置疑了。即身份得到验证了。第二步这还能够保证数据完整性,能解密出来就表示Bob得到一段特征码了,那么我们Bob用同样的加密算法再计算出这段数据的特征码,然后与解密出来的特征码相比较,如果二者一样我们就可以确定这段数据在发送过程中是没有被篡改过的。即数据的完整性得到了验证。但是却有一个点还没有得到保证,即数据的保密性,数据传输过程中我们Eve都能看到,Eve也能验证这的确是Alice发的,但是保密性无从得到保证。
d、公钥作用中的密钥交换:所以在我们刚刚描述的这种机制之上我们再多了一种机制。即我们Alice要发送一段数据给Bob时Alice用单向加密算法先计算出这段数据的特征码,而后用自己的私钥加密这段特征码生成数字签名,这个就叫生成数字签名的过程。然后Alice会继续用对称加密算法去生成一个一次性的对称密钥,用对称加密算法结合生成的密钥去加密数据+特征码这整段数据,为了保证Bob能解密此时Alice会拿到Bob的公钥去加密刚刚的这个对称加密密码并附着在这个数据后面。然后将这整个数据一并发送给Bob,此时Bob的公钥加密信息只有Bob能解密,Eve是不能的,因为只有Bob的私钥才能进行解密。因此这段数据发过来以后Bob先用自己与这个数据加密的公钥配对的私钥解密这段数据,解密出来以后就得到密码了,这段过程就叫密钥交换。即用对方的公钥加密一个密码发送给对方,这样只有对方能解密。对方从而能得到里面这个密码了。这个密码是用来实现对称加密和解密的密码。其它任何人都是破解不了的。而密码通常又很短,所以这个就叫密钥交换
e、Bob现在拿到了这段密钥,他就可以解密这段数据了,解密之后得到的就是里面这段数据了,这段数据的传输过程中如果Eve拿到了的话Eve是没法解密的,首先他没有Bob解密出来的密码,其次他也没有对称加密密钥,就解密不了这段加密的数据了。从而Bob拿到数据之后首先用自己的私钥解密密钥,然后用密钥解密数据。那么这个报文是不是Alice发的呢?有没有问题呢?接着他就用Alice的公钥来解密加密的签名,如果能解密说明确实是Alice发的,其次再用单向加密算法去计算这段数据的特征码并与解密出来的特征码相比较看看是不是一样,如果是一样说明数据的完整性得到了验证。
f、我们上述就描述了二者通信过程中点对点发送的机制,而这个发送机制中三种加密方法都用上了,单向的,对称的,公钥的。通过上述描述了公钥加密两种方式,即身份认证和秘钥交换。
4、我们再来理一遍
a、身份认证:首先发送方用自己的私钥加密数据特征码,接收方用对方的公钥去解密,如果能解的开就说明是对方发的,因为密钥是成对出现的,私钥只有他自己有
b、数字签名:数字签名中就依赖到了身份认证,即发送方用自己的私钥加密特征码这个结果就叫数字签名,因此数字签名就是为了完成身份认证的。
c、密钥交换:我自己生成一个密码,但是要对方的公钥去加密这段密码,然后发送给对方,因此只有对方能解密,因此对方解密出来就能得到密码了。所以接下来就能够用这个密码去解密我们使用对称加密方式加密的数据。
d、比如Bob和Alic之间要进行无数次通信,这个通信过程的数据量也非常大,我们不可能使用公钥加密来加密,因为公钥加密的安全性虽然很高但是性能太差了,所以他们决定使用对称加密,而Bob和Alice此前从来没有见过面怎么办呢?因此我们两得商量出来一个密钥,因为此前没见过面,所以Alice可以拿到Bob的公钥自己生成一个密码,然后用对方的公钥加密以后发送给对方,对方只有自己的私钥能解密,所以密钥对方也知道了,因此接下来的整个通信过程就使用这个密钥来加密解密就可以了。
e、总结出来相应的过程如下
加密过程:
(1)、Alice生成数据,通过单向加密算法获得需要发送数据的特征码
(2)、Alice用自己的私钥加密特征码并将结果附加在数据后面
(3)、Alice使用对称加密算法生成一个临时的对称密钥
(4)、Alice用这个对称密钥加密 (数据+自己私钥加密后的特征码)
(5)、Alice获取到Bob的公钥,并用Bob的公钥加密 我们使用对称加密算法生成的临时密钥,并将我们加密后的密码串附着在 用此密码串加密后的(数据+自己私钥加密后的特征码) 后面然后发送给Bob。 此时我们三方监听者是无法获取到我们的数据的,因为第一他没有Bob的私钥,第二他也没有解密数据的密码(即我们单向加密的密码串的密码)
解密过程:
(1)、Bob收到Alice发送过来的数据后,首先通过自己的私钥解密数据并获得我们的对称密钥
(2)、Bob通过密码串解密 数据 + Alice私钥加密过的特征码
(3)、Bob通过Alice的公钥解密特征码,如果能解密表示数据确实是Alice发的。即身份认证
(4)、Bob通过同样的单向加密算法计算这段数据的特征码看是否与Alice发送的数据中解密出来的特征码是一致的,即数据的完整性验证
(5)、接下来的数据传输过程我们就通过我们Alice发送过来的对称加密的这个密钥进行数据的加密和解密了
5、如果不考虑可用性,我们通过gpg或者openssl都可以实现,如果我们我们要发送数据给Bob,openssl中这几种加密方式都有。我们可以手动去实现,gpg更容易实现。
a、我们上述的这种传输方式存在着极大的风险,Alice和Bob此前从来没有见过面,现在我们Alice在网上喊一嗓子说Bob给我一个公钥,于是Eve跳了出来把自己的公钥提供给Alice并告诉Alice说我就是Bob,Alice就信以为真,然后与Eve进行通信了,但是Eve又不知道Bob和Alice之间有什么交易,怎么办呢?而后Eve再伪装成Alice告诉Bob我是Alice,我要和你通信,Bob也不知道他是不是Alice,Eve把自己的公钥发给Bob了,Bob又把自己的公钥发给Eve了,于是二者之间就开始通信。最后的情况变成了Bob以为自己在和Alice通信,Alice也以为自己在和Bob通信,而且的确他们之间在互相知道自己要通信的事。但是Alice和Bob的通信都被Eve监视了,这就叫中间人攻击。
b、因此我们缺失的一环在什么地方呢?我们前面说过Bob和Alice通信都需要对方的公钥,因此这个缺失的一环在可靠的获取对方的公钥的这一环上。因为我们Bob要Alice的公钥如果是Eve发过来他就信以为真,因为没有可靠手段去验证它是否是真的Alice。于是就有了一个第三方机构,这就是CA。
二、CA
1、CA叫做证书颁发机构,他有什么用呢?CA就是为了保证通信双方都能够可靠的拿到对方公钥而特地设立的一个双方都公信的第三方可信机构。比如Bob认可这个CA,只要这个CA说的他都信,Alice也认可这个CA,只要这个CA说的他也都信。因此为了让别人都认可自己,Bob把自己的公钥提前给CA,由CA把这个公钥给他做一些特殊放伪技术然后发给Bob,因此以后任何人和Bob通信Bob就拿着这个经过特殊加工的公钥扔给对方就可以了。比如Alice向Bob要公钥时,我们Bob就把这个经过CA特殊处理过的公钥(也称为证书)扔给Alice,Alice不会一上来就认可这个证书,她要想办法去验证第一这个证书中的内容是否合法。第二是不是我所信任的这个CA所颁发的。如果这两步能得到验证于是我们才认为这里面的证书是Bob的证书,并且也只有Bob的证书才行。从而,我们Bob要Alice的证书Alice发给Bob,Alice要Bob的证书Bob发给Alice,但双方都要通过CA留下的这个防伪技术来验证一下。
2、证书里面即包括了拥有者自己的公钥还包括了拥有者自己的各种信息,包括他的名字,单位等各种信息,所以Eve此时如果还想冒充要怎么冒充呢?此时我们Bob要Alice的证书,然后Eve发过来了,Bob一看他的名字不是Alice的,或者说里面的确写的是Alice的,但是Eve怎么能伪装成Alice呢?这就意味着接下来都需要靠CA的人品来保证了,Eve向CA申请证书时他告诉CA我叫Alice,他只能这样干,不然他不可能在证书中写着我叫Alice,因此CA必须要实地考察确定这个人是不是Alice,如果CA认可了他是Alice的话那么就会给他发证书,这样Bob就受骗了,因此CA经过调查发现他不是Alice然后就不认可他也就不会给他发证了。那么CA到底是谁呢?我们Eve能否找一个其他的CA去给他发证并且能给他发证呢?这个肯定是可以的,比如这个CA是私下的。但是我们Bob和Alice是不认可这个CA的,因此我们Eve拿着这个证书给Bob或Alice的时候他们是不认可这个CA的,然后这个证书就被直接丢弃了,因此找一个信任的CA是至关重要的
3、那么问题是我们怎么去验证这个CA呢?其实我们CA给每一个人发证书的时候证书里面主要包含什么呢?
a、拥有者的名称
b、拥有者的公钥
c、证书有效期限
d、最主要是CA会用自己的私钥去加密这整个数据的特征码,他会把我们Bob的公钥的特征码提取出来然后用自己的私钥加密后附着在后面(即数字签名)
e、因此我们Bob把证书发给Alice后Alice怎么验证这个证书是ok的呢?Alice会先用我们CA的公钥去解密这段签名,如果能解密就说明这是CA发的,表示没啥问题了,并且她还会用同样的单向加密算法去计算这个证书的特征码,去验证和我们解密出来的特征码是不是一样,如果是一样的就说明我们的证书的内容没问题,那么接下来就有问题了,Alice要用CA的公钥去解密这段特征码,因此,我们Alice如何获得CA的公钥呢?因此CA为了让别人能验证他所发的证的确是他发的所以CA的公钥要提前发给每一个信任他的人,他是通过这样的方式来下发的:为了使得整个法则是一致的所以CA会先给自己发一个证,这个给自己发的证里面包含了CA自己的信息和CA的公钥,因此Alice只有拿到CA的证才能获得CA的公钥,只有拿到CA的公钥才能解密CA的签名,才能验证CA给其它人发的证书是不是ok的。
4、现在的问题是,怎么可靠的获得CA的证书,我们一般不通过网络发送,都是通过当面交易,因此一年的证书使用费都在万元以上。所以每一个人向CA申请证书的时候CA会考察你的各种各样的证件,包括上查八代。这就意味着CA的证书要当面交易,但是如果我们全球假如有几千万人要CA的证书难道CA都是当面发给你么?其实,我们全球CA之间是有从属关系的,他们是有互信链的,比如全球有很多CA,如果这些CA之间是互相信任的话,比如Bob认可CA1,然后Bob也就可以信任CA2,这种信任关系是可以传递的,同时为了使得CA管理起来比较方便,就有一个根CA,在根下面有很多派出机构,使得我们的CA的信任关系是可以互相传递的,这是第一层。第二层就是全球的CA单位基本是固定的,因此很多操作系统的发行者,比如微软这些,在操作系统发行的时候他就将相应的CA内置在操作系统中。也就是说在提前CA机构就将证书给了微软一份,所以一般正版系统中都会有,不过如果你装的是盗版系统就不好说了。不过好在证书伪装一般是很难的。不过对于Linux系统来讲,系统一般不内置,我们一般都需要手动提供。
5、如果Bob的私钥丢了的话,那么任何人都可以和Alice通信了,这个时候Bob为了降低损失要怎么办呢?这时候Bob会立即向CA申请吊销证书,那么你吊销证书别人怎么知道呢?我们后面再说。
6、公钥加密的常用算法
a、RSA:他即是公司名,也是算法名,也是这个算法创建者的三个人的首字母
b、DSA(数字签名标准):有时候也称为DSS(数字签名标准),他与RSA不同的地方在于DSA仅能实现签名而不能用于加解密。RSA既能签名又能加密和解密,因此RSA的功能比DSA要强大。
c、ELGamal
三、单向加密
1、只能加密,不能解密,他所执行的操作就是提取数据指纹(特征码)。
2、特性:定长输出,雪崩效应
3、功能:数据完整性验证
4、常见的算法:
a、md5(Message Digest 5):消息摘要算法,第五版本。定长输出为128个字符,128bits
b、sha1:(Secure Hash Algorithm 1):安全的哈希算法,第一版。定长输出为160字符,160bits
c、sha224,sha256,sha384,sha512
5、CentOS6和7的用户密码加密已经从CentOS5切换至sha512
四、密钥交换
1、密钥交换通常叫做IKE(Internet Key Exchange),即互联网密钥交换
2、常见的实现方法有两种
a、公钥加密
b、DH(Deffie-Hellman):即地狱男爵,即他的两个发明人的名字,人们一般比较倾向于使用DH,因为使用公钥加密毕竟要在互联网上传送,还是会有安全隐患,而DH方式不需要传递密码,只需要双方使一个眼色双方就都生成了一个彼此都知道的密码。他的实现原理大概如下
(1)、假如我们有Bob和Alice两个人,他们双方协商生成一个素数p,和一个生成器g,然后Bob生成了一个素数p传递给Alice,当然中间人Eve是可以看到我们p和g的,因为这个p和g数据是明文交换的。
(2)、然后Bob会私下生成一个数据叫x,Alice会生成一个数据叫y,这个x只有Bob知道,y只有Alice知道。然后加下来我们Bob会去求p的x次方,并对g做取模,然后把结果传递给Alice,同理,Alice会用同样的方法去求p的y此方,并对g取模,然后把结果传递给Bob。比如我们的Bob的形式是 1111111^3891%g=abc,我们Eve能看到我们的abc,也能看到我们的g,但是有p和g和abc他把中间的这个3891是求不出来的,因为太难了
(3)、此时我们Bob拿到的是 p^y%g的结果,我们Alice拿到的是p^x%g的结果,然后Bob接下来会将这个结果再求x次方,因为A虽然不知道y的值但是他知道x的值。对于Alice来讲他也会将结果求y次方。因此Bob不知道y是什么Alice不知道x是什么但是他们求得的结果一定是一样的。即Bob的等式是 (p^y%g)^x=p^yx%g,Alice的等式是(p^x%g)^y=p^xy%g,这个结果就是双方传递后的密钥。
四、PKI
1、概念:我们CA还要提供一个证书吊销列表,以便用于证书吊销操作。而这一切由CA为核心生成了另外一套安全架构体系叫PKI(Public key Infrastructure),即公钥基础设施,他的组件如下
a、签证机构:CA
b、注册机构:RA:相当于办身份证的当地街道派出所,他可以帮你申请身份证但是不能自己制作身份证。但是可以给你发证,这个身份证都是被全国认可的。
c、证书吊销列表:CRL:即任何一个用户他的私钥丢失了那么任何人都有可能通过不法手段窃取他的私钥,为了避免这个效果就可以将私钥申请吊销
d、证书存取库:证书签发机构发的证有一个公共存储位置,任何人想拿证书在这儿都可以获取到,但是你下载后只能用只能看,不能茂名顶替
2、X.509v3:为了能够使得颁发证书的机构颁发的证书格式一致,所以国际标准版组织定义了一个数字证书格式标准X.509。他就是定义证书结构和认证协议标准。其组成结构如下
a、版本号
b、序列号:相当于这是第几个证书
c、签名算法ID:即我们这个证书作为CA来讲是怎么签的名,用什么算法签的名,这个很关键,因为涉及到对方的解密
d、发行者名称:即CA自己的名字
e、有效期限
f、主体名称:你自己的名字
g、主体公钥
h、发行者的唯一标识
i、主体的唯一标识
j、扩展
k、发行者的签名
3、双方通信时需要做如下步骤
a、Bob和Alice通信之前首先都要用到彼此的公钥,因此双方通信时要先协商,先将对方的公钥发给彼此
b、第二步:待会儿会加密通信,那么要用到什么算法呢?因为我们分别要单向加密,对称加密,公钥加密和秘钥交换。每一种加密都要用到各种算法,比如单向加密用sha256,公钥加密使用rsa,对称加密使用aes,双方商量好了过后加密才会进行。
c、第三步:Bob拿到Alice的公钥以后首先要验证证书,不然就没法验证所期望通信的人了。那么怎么验证并且要验证哪些内容呢?
(1)、要用CA的公钥去解密CA的签名,能解密说明证书的来源可靠
(2)、用同样的算法去加密证书取得特征码与解密出的特征码相比较,如果二者一样说明证书的完整性可靠。
(3)、我们要检查证书的有效期限在不在当前的时间范围内,如果过期了肯定就不被认可了
(4)、验证名字,我现在要通信的是Alice,但拿到的证书上写的是Eve,那么也是不能被认可的,所以还需要验证主体名称和你期望通信的那个人是否对应
(5)、检查证书是否被吊销,如果已经被吊销了也就不被认可了
五、计算机https通信模式
1、我们http本身是不加密的,如果要进行加密就需要借助我们的ssl,你可以理解为ssl给http提供了一个隧道,http他只需要把请求发给ssl就行,后续的所有事情就都不需要他来管了。ssl就负责调度TCP,IP协议来完成通信了,就不需要http来调了。所以说我们中间多了半层,而多了半层以后整个过程就变得复杂了起来
2、因此基于SSL的通信是这样实现的
a、第一步:客户端发hello信息给服务器,然后服务器端响应hello信息给客户端,双方决定要进行ssl会话了。而这个过程中双方还要协商我们如果要通信的话没问题了要用什么样的各自的加密算法,比如对称加密用什么方法,公钥加密用什么方法,单向加密用什么方法以及密钥交换用什么方法。没问题就进入下一步
b、第二步:客户端请求服务器端要证书,服务器端把自己的证书发送给客户端,客户端接下来验证证书,如果没有问题 按理来说客户端应该发送自己的证书,不过客户端一般没有证书的,因为你要买证书的话一年好几万,太贵了。客户端没有证书意味着客户端我不在乎你服务端是谁,因为服务器端谁都可以访问,之所以客户端要验证客户端证书是因为害怕被钓鱼。
c、第三步:服务器端发送证书给客户端以后客户端要验证证书,如果验证一切都没问题的话,刚才双方已经协商好了基于什么方式进行密钥交换,假如说就基于公钥加密进行交换的话客户端就选择一个对称密钥,怎么选择呢?就用各种随机数生成器生成的随机数就当密码了,然后把这个密码用对方的公钥加密后发给对方,这时候我们的服务器端就有这个密码了,于是服务器端就用这个密码去加密客户端所请求的网页,客户端就能浏览到这个网页了
d、第四步:通信完成后就断开会话了
3、但是现在就有一个问题了,比如我们要访问淘宝于是在浏览器中就输入了https://www.tbao.com,于是服务器就把证书发给我们一份。这个证书中包含了我们说的格式,内容,主体的名称,这个名称与访问的服务器上填入的名称要不要保持一致呢?这个是肯定的。因此服务器证书主体的名字必须要与在互联网上被访问时的名字保持完全一致,否则别人的浏览器就会提示用户使用有风险。
六、SSL与TLS历史
1、我们在局域网中可以私建CA
2、SSL:secure sockets Layer,是由网警(Netscape)公司发明的,大概是在1994年
a、相应的版本V1,V2,V3(据说有严重漏洞,因此被谷歌在浏览器中强制禁用)
3、TLS:Transport Layer Security(传输层安全),因为SSL是由Netscape公司研发的因此他有SSL的版权,因此国际电气工程师协会为了防止其一家独大,他们也研发了一套协议叫TLS,他与SSL基本是兼容的
a、IETF:1999年发布
b、相应版本:V1.0,V1.1,V1.2,V1.3
4、我们一般说的SSL也有可能说的是TLS,只是习惯性的说成SSL
5、分层设计
a、最底层:基础算法原语的实现:aes,rsa,md5
b、向上一层:各种算法的实现
c、再向上一层:组合算法实现的半成品
d、最高层:用各种组件拼装而成的各种成品密码学协议软件
6、协议的开源实现:OpenSSL