SSL与TLS

1.安全通信要解决的问题:保密性、信息完整性、端到端认证。主要考虑的攻击手段:篡改和重放。防止篡改的主要手段,加入摘要或者MAC,防止重放的主要手段,加入随机数或者序号。

2.SSL把消息分割成记录,每个记录进行单独的加解密和验证,这样,部分数据准备好就可以发送和使用,而不必等到所有数据传输完毕在进行处理。

3. OpenSSL指令分成三部分:标准指令,摘要指令和加密指令。

标准指令内容比较丰富:1)生成密钥:genrsa/gendh/gendsa; 2)管理密钥:rsa/dh/dsa; 3)功能:rsautl (rsa加解密,签名和验证)/dgst; 4)SSL模拟和调试:s_client/s_server;5)证书相关:ca

openssl genrsa -out key 8192 -des3 #生成长度为8192的key
openssl rsa -in key -out key5 -outform d #格式转换 pem->der
openssl rsautl -in msg -inkey key -sign -out dgt #计算rsa签名(签名是私钥加密,加密是用公钥加密)
openssl rsautl -in msg -pubin -inkey key -verify -out dgt #验证签名,注意其中的-pubin参数
openssl req -x509 -new -key private.pem -out root.pem #生成自签名证书,即根证书
openssl x509 -in root.pem -noout -text #输出证书内容
openssl req -new -key key -out cert.pem  #生成一个新的证书,使用key中保存的私钥
openssl ca -in ca1-req.pem -out ca1.pem -notext -config ./openssl.cnf #使用CA证书签发用户证书,其中需要按照openssl.conf中配置的目录进行设置
openssl rsa -in public.pem -noout -text #将密钥以可读形式输出

4.SSL通信过程。


ClientHello: Client发送自己支持的加密套件,支持的压缩算法(一般是空),生成一个随机数用于将来生成master_secret的一个源。

ServerHello: Server选择一个加密套件,压缩算法(一般不压缩),生成一个随机数用于将来生成master_secret的一个源。Server生成随机数可以有效的防止全重放攻击,即防止攻击者重放从握手开始的整个过程。

Certificate: Server 将自己的证书发送个client。

ClientKeyExchange: Client提取出证书中的公钥,生成一个随机数(pre_master_secret),使用公钥加密pre_master_secret发送给Server。同时将握手过程中的两个随机数+pre_master_secret使用KDF(例如PRF,伪随机数函数)生成master_secret。利用master_secret使用KDF导出通信中要用的加密、解密、计算MAC、验证MAC的密钥。Server收到pre_master_secret,使用相同的算法生成master_secret和其他密钥。

ChageCipherSpec:一个字节长,表明接下来Client发送的报文都会使用约定好的加密算法和密钥进行通信。

扫描二维码关注公众号,回复: 1820354 查看本文章

Finished:将握手过程中所有的消息计算MAC发送给Server用于验证。这么做的目的是保证在握手过程中消息没有被篡改。这一步在ChageCipherSpec之后,所以会使用协商好的加密算法和密钥。

ChangeCipherSpec: 一个字节长,表明接下来Server的报文都会使用约定好的加密算法和密钥进行通信。

Finished:将握手过程中所有的消息计算MAC发送给Client用于验证。这么做的目的是保证在握手过程中消息没有被篡改。这一步在ChageCipherSpec之后,所以会使用协商好的加密算法和密钥。

Application_data: 应用数据。

close_notify:关闭SSL连接

5.证书工作原理。

证书好比身份证。1)获取到一个服务器的证书轻而易举,然而如果拿不到相应证书对应的私钥,则无法解密客户端发送的随机消息验证。只有真正的证书持有者才能完成解密,通过验证。2)生成一个自己持有私钥的证书轻而易举,然而要被客户端信任才行。客户一般会有信任的根证书。通信过程中,服务器要把自己的证书链发送给客户端。证书链:ROOTCA->CA->USER_CERT。客户端会用CA证书的公钥验证USER_CERT是不是CA签发的,用ROOTCA的公钥验证CA的证书是不是它签发的,然后看看根证书是否在自己的信任证书中。因为证书生成过程中,上级CA会用自己的私钥在签发的证书中添加自己的签名。只有真正的证书才能通过客户端证书链认证。因此虽然制作一个自己持有私钥的证书轻而易举,但是如果不是客户端信任的CA签发的,客户端并不会信任这个证书。

6.临时RSA/DH/DSS

服务器有自己的高强度密钥。服务器可以生成临时RSA(强度略低,一般每天生成一个,当然也可以每次生成一个),但是会使用自己的私钥进行签名,从而保证这确实是正确的服务器生成的。在握手的过程中会有一个ServerKeyExchange,用于发送Server生成的临时RSA。临时RSA最初是为了解决出口限制的问题。但是因为其有不同的安全特性,现在仍然在被使用。如果使用永久RSA,一旦私钥被攻破,那服务器和客户的通信全都被视为明文,攻击者还可以冒充服务器进行通信。如果使用临时RSA,如果临时RSA被攻破,则只影响一段时间的通信安全性。如果永久RSA被攻破,攻击者只能冒充服务器,却不能得知先前建立的SSL连接的通信内容。临时DH/DSS和临时RSA类似。



猜你喜欢

转载自blog.csdn.net/zhshuai1/article/details/79429030