SSL 握手机制

都是些啥哦, 证书包含的是公钥, 私钥总是秘密的, 不会在网络上传播...

SSL 的握手过程通常是酱紫的, 可以看看RFC文档,写的很详细, 代码看 openssl , 应该算比较简单易懂, 自己写也不是非常麻烦...
1) Client->Server : ClientHello 通常包含这些东西..
  clientRand  : client 生成的随机数序列
  sessionID  : 用于session恢复的过程, 简化的SSL握手过程,在第一次的握手工程中服务器生成的..
  cipherSuiteList , CompressionMethodList : 客户端支持的加密算法和压缩算法列表

2) Server->Client :
    21) ServerHello : 通常包含这些东西..
    serverRand  : server 生成的随机数序列
    sessionID  : 如果 ClientHello.sessionID 在服务器端存在, 则服务器返回相同的 SessionID
                以提示这是一次简化的握手过程.
CipherSuite CompressionMethod : 服务器选择的加密算法和压缩算法

A: 不要求服务器鉴权的情况, 不能保证服务器是否伪装, 不安全, 现在可能很少遇到
  22) ServerKeyExchange 包含服务器公钥(没有证书)

  B: 要求服务器鉴权,不要求客户端证书的情况, 这种用的最多.
    22) Certificate : 服务器证书
  
  C: 要求服务器鉴权,要求客户端证书, 在安全性要求很高的场合使用, 比如网银啥的
    22) Certificate : 服务器证书
    23) CertificateRequest : 客户端证书请求
  
  2E) ServerHelloDone
  
3) Client->Server :
  A B )
    31) ClientKeyExchange    服务器公钥加密的 前主密文( PRE_MASTER_SECRET )
  C  )
    31) Certificate   客户端证书
    32) ClientKeyExchange 服务器公钥加密的 前主密文( PRE_MASTER_SECRET )
    33) CertificateVerify   客户端证书对之前握手数据的签名
  
  3E) Finish

4) Server->Client :
    41) ChangeCipherSpec  
    42) Finish

服务器用自己的私钥解密 ClientKeyExchange 中包含的加密的前主密文, 这样服务器和客户端就可以用相同的
参数( clientRand , serverRand , PRE_MASTER_SECRET ) 计算主密钥( MASTER_SECRET ) , 最后双方用同样的
算法对主密钥进行扩展(比如PRF啥的), 生成会话密钥( read_key , write_key , read_mac , write_mac )

session恢复,简化的握手过程:
1) Client->Server : ClientHello
2) Server->Client :
  21) ServerHello
  22) ChangeCipherSpec 密钥改变
  23) Finish
3) Client->Server
  31) ChangeCipherSpec
  32) Finish

客户端和服务器用相同的参数( ClientRand , ServerRand , 上次会话的主密钥 ) 计算此次会话的主密钥.

你可能感兴趣的:(C++,c,算法,C#)