OpenSSL原理剖析

可以转载,转载请注明出处,谢谢!

主要参考了以下博文,对作者表示感谢,让我学到了不少东西。并附带了一些自己的理解,有问题欢迎沟通:

https://blog.csdn.net/it_man/article/details/24698093

https://blog.csdn.net/oldmtn/article/details/52208747

https://blog.csdn.net/duanbokan/article/details/50847612

https://www.cnblogs.com/Anker/p/6018032.html

https://blog.csdn.net/u011456940/article/details/57416526

公钥/私钥/签名/验证签名/加密/解密/非对称加密

  我们一般的加密是用一个密码加密文件,然后解密也用同样的密码.这很好理解,这个是对称加密.而有些加密时,加密用的一个密码,而解密用另外一组密码,这个叫非对称加密,意思就是加密解密的密码不一样.初次接触的人恐怕无论如何都理解不了.其实这是数学上的一个素数积求因子的原理的应用,如果你一定要搞懂,百度有大把大把的资料可以看,其结果就是用这一组密钥中的一个来加密数据,可以用另一个解开.是的没错,公钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为签名和验证签名.

  因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给人和人,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开成有用的数据,其他人就是得到了,也看懂内容.同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是.这个被称为签名.

  实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性.

公钥私钥加密算法(非对称加密算法):比较著名的有RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名.

CA数字证书与普通的key有啥区别?(KPI保证用户公钥的真实性)

CA数字证书文件.crt里面包含了公钥和信息文件,不包含私钥.key文件。

一般情况下,发送者生成公钥文件,然后交给其他人利用这个公钥文件进行加密,然后发送者再用自己的私钥解密,就能保证接收到的数据安全性。而CA证书则是,将要发送公钥文件的发送者的公钥和文件信息进行私钥加密,即签名,生成签名证书。然后把CA自己本身的公钥文件公开。这样的话,其他的得到CA公钥的人就可以对签名文件解密,即验证签名,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了。所以,一般的人,公钥加密私钥解密;CA,公钥解密(验签)私钥加密(签名,生成签名文件crt)。

X509是什么?

通用的证书文件格式定义.通过x509对应的函数可以解读CA证书中的信息。

真正数据传输时的对称加密算法和建立连接的非对称加密算法区别:

真正在数据传输的时候用的不是非对称加密算法(即不是公钥私钥加密),而是在客户端与服务器间传输的数据是通过使用对称算法(如 DES 或 RC4)进行加密的。SSL加密通道上的数据加解密使用对称密钥算法,目前主要支持的算法有DES、RC4、3DES、AES等,这些算法都可以有效地防止交互数据被窃听。对称密钥算法要求解密密钥和加密密钥完全一致。因此,利用对称密钥算法加密传输数据之前,需要在通信两端部署相同的密钥。

公用密钥(非对称)算法(通常为 RSA)只是用来获得加密密钥交换和数字签名的,此算法使用服务器的SSL数字证书中的公用密钥。

与非对称密钥算法相比,对称密钥算法具有计算速度快的优点,通常用于对大量信息进行加密(如对所有报文加密);而非对称密钥算法,一般用于数字签名和对较少的信息进行加密。

所以说,非对称的加密(如RSA)相当于只是用于刚开始建立连接,通道打通之后就用的是对称加密算法(RC4)。

保证数据的完整性:

为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。

MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的摘要数据,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的。利用MAC算法验证消息完整性的过程如下图

https://blog.csdn.net/it_man/article/details/24698093

所示。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。MAC算法要求通信双方具有相同的密钥,否则MAC值验证将会失败。因此,利用MAC算法验证消息完整性之前,需要在通信两端部署相同的密钥。

RC4对称加密是为了保证数据的安全性,MAC(如MD5)摘要算法是为了保证数据的完整性。

利用非对称密钥算法保证密钥本身的安全

对称密钥算法和MAC算法要求通信双方具有相同的密钥,否则解密或MAC值验证将失败。因此,要建立加密通道或验证消息完整性,必须先在通信双方部署一致的密钥。SSL利用非对称密钥算法加密密钥的方法实现密钥交换,保证第三方无法获取该密钥。如图所示

https://blog.csdn.net/it_man/article/details/24698093

SSL客户端(如Web浏览器)利用SSL服务器(如Web服务器)的公钥加密对称密钥,将加密后的密钥发送给SSL服务器,只有拥有对应私钥的SSL服务器才能从接收到的密文中获取原始的对称密钥。SSL通常采用RSA算法加密传输密钥。

实际上,SSL客户端发送给SSL服务器的密钥不能直接用来加密数据或计算MAC值,该密钥是用来计算对称密钥和MAC密钥的信息,称为premaster secret。SSL客户端和SSL服务器利用premaster secret计算出相同的主密钥(master secret),再利用master secret生成用于对称密钥算法、MAC算法等的密钥。premaster secret是计算对称密钥、MAC算法密钥的关键。

单向验证(客户端对服务器进行验证)过程:

https://blog.csdn.net/duanbokan/article/details/50847612

  1. 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
  2. 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
  3. 客户端使用服务端返回的信息验证服务器的合法性,包括:
    1. 证书是否过期
    2. 发型服务器证书的CA是否可靠
    3. 返回的公钥是否能正确解开返回证书中的数字签名
    4. 服务器证书上的域名是否和服务器的实际域名相匹配

验证通过后,将继续进行通信,否则,终止通信

  1. 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
  2. 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式(如RC4-MD5)。
  3. 服务器将选择好的加密方案通过明文方式返回给客户端(只是发送的加密方式和MAC方式)
  4. 客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥(premaster secret),使用服务端返回的公钥进行加密,将加密后的premaster secret发送至服务器
  5. 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取premaster secret。 
  6. 客户端和服务器通过相同的premaster secret 来计算出相同的主密钥master secret,然后通过master secret来生成对称密钥和MAC算法等的密钥。

在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。

单向与双向的区别:

双向认证 SSL 协议要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性,因为并不是具体通信内容数据公开,而只是对称加密方案或者MAC方案公开的)密码方案。这样,双方具体的通讯内容,就还是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用128位加密通讯的原因。

  一般Web应用都是采用SSL单向认证的,原因很简单,用户数目广泛,且无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,情况就不一样,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。

SSL_accept老是返回-1出错原因:

有了服务器的SSL数字证书,客户端就可以验证服务器的身份。SSL 协议的版本 1 和 2 只提供服务器认证。版本 3 添加了客户端认证,此认证同时需要客户端和服务器的数字证书。解释了为什么用SSLv1版本的时候,用SSL_accept老是返回-1出错,因为版本1和版本2不支持对客户端的认证。

猜你喜欢

转载自blog.csdn.net/zz420521/article/details/81225946