SSL/TLS 链接的建立/握手


HTTPS 即 HTTP-within-SSL/TLS,其中 SSL/TLS 又分别表示:

SSL:Secure Sockets Layer

TLS:Transport Layer Security

SSL/TLS 建立链接及握手的过程为:

SSL/TLS 建立链接及握手的示意图

阶段一

  • Client Hello

    • 客户端向服务器发送

      • 随机数 Random1
      • 客户端支持的加密套件 Support Ciphers
      • SSL 版本
  • Server Hello
    • 服务器向客户端发送
    • 从客户端发送加密套件列表中选择一个,加密套件决定了后续加密及生成摘要的算法
    • 生成随机数Random2。两端的随机数会在后续生成对称密钥时使用。

阶段二

  • Certificate

    • 服务器将自己的证书下发给客户端,让客户端验证服务器的身份。( 12306 曾经使用国内自己签发的证书,结果 Chrome 不认就是这个道理)
    • 客户端验证后从证书取出公钥
  • Server Key Exchange
    • DH 算法需要此步骤,发送服务器使用的 DH参数,RSA 不需要
  • Certificate Request
    • 可选。服务器要求客户端上报证书。对安全性要求极高时使用。
  • Server Hello Done
    • 通知客户端 Server Hello 结束

阶段三

  • Certificate Verify

    • 客户端收到证书后从CA验证其合法性。
    • 验证合法后从证书取出公钥,生成随机数 Random3
    • 使用公钥非对称加密Random3 生成 PreMaster Key
  • Client Key Exchange
    • 客户端将 PreMaster Key 发送服务器,服务器用自己的私钥解出 Random3。
    • 此时两端都拥有 Random 1~3
    • 两端使用相同的算法生成密钥,握手结束后的数据传输都使用此密钥进行对称加密。
  • 为何需要三个随机数?
    • 因为SSL/TSL 握手过程数据明文传输,多个随机数种子生成的密钥不容易暴力破解。

阶段四

  • Change Cipher Spec (Client)

    • 这是一条事件消息
    • 客户端通知服务端后续消息都会使用前面协商出来的密钥加密。
  • Encrypted Handshake Message (Client)
    • 这是条 Client Finish 消息

      • 客户端将前面的握手消息生成摘要,使用前面协商的密钥加密。
    • 这是客户端发出的第一条加密消息
    • 服务端使用密钥解密,解密成功说明密钥一致。
  • Change Cipher Spec (Server)
    • 事件消息
    • 服务端通知客户端后续消息都使用加密。
  • Encrypted Handshake Message (Server)
    • Server Finish 消息
    • 服务端将握手过程生成摘要
    • 使用密钥加密发送给客户端
    • 这是服务端发送的第一条加密消息
    • 客户端收到后解密,成功说明密钥一致。

相关资源

原文地址:https://www.cnblogs.com/Wayou/p/ssl_tls_handshake.html

时间: 2024-11-02 21:36:52

SSL/TLS 链接的建立/握手的相关文章

https调用出现【基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系】错误

今天不知道为什么网站访问就出现问题了,惊得我一头汗,别是我昨天打了log4,就影响今天的内容了,后来发现,确实不是,是写入流失败了,报[基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系]错误,后来让总线查,他们说是自己的接口链接证书失效了,正在补救. 病急乱投医中网上查到解决方法:重写通信通道连接验证回调 直接上代码: 1 先加入命名空间: 2 3 using System.Net.Security; 4 using System.Security.Authentication;

解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系

今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". 后来把DLL文件进行反编译,发现是在获得请求的时候出错了. 引用 WebResponse response = WebRequest.Create("https://--").GetResponse(); 于是在服务器上用浏览器打开上面的地址,发现会弹出一个确认证书的窗口,看来是证书问题.

基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系

#region private static bool ValidateServerCertificate 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系." /// <summary> /// 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系." /// </summary> /// <param name="sender"></param&

C# 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". 后来把DLL文件进行反编译,发现是在获得请求的时候出错了. 引用 WebResponse response = WebRequest.Create("https://……").GetResponse(); 定义一个类,来对远程X.509证书的验证,进行处理,返回为true.我们要自己定义一

System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。 ---&gt; System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效。

今天写程序的时候调用到一个第三方提供的https地址,访问此地址去获取加密的json格式数据,出现BUG c#报错 :  System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系. ---> System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效. 引用: private string callbackRefund(string url, string d

基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系

//1. ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; //2. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback ( delegate { return true; } )

C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

在远程调用WebService时出现下面的情况: 这种情况一般是由于证书有问题时出现,如果在浏览器中打开是这种情况: 解决方法新建一个类,代码如下: 1 public static class CertificateTrust 2 { 3 4 public static void SetCertificatePolicy() 5 { 6 ServicePointManager.ServerCertificateValidationCallback 7 += RemoteCertificateVa

[转][C#]基础连接已经关闭 未能为 SSL/TLS 安全通道建立信任关系

来自:https://www.cnblogs.com/waw/p/8286608.html 代码部分: static TestApplication(){ ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X

Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

摘要: Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Seurity之外,拓展了一个android.security包,此包中就提供了KeyChain.它包含了主要三个重要的规范:JavaCryptography Extension(简写为JCE),JCE所包含的内容有加解密,密钥交换,消息摘要(Message Digest,比如MD5等),密钥管理等.本文所涉及