想学习TLS协议最好的方法应该是去看RFC,但如果对安全传输协议没有一些基本认识的人很难一上来就读懂RFC里面的种种细节和设计原则,所以这里为了能够进一步去弄懂TLS协议,把一些基本的知识放在这里,算是扫下盲。

1. TLS与SSL的区别:SSL是TLS的前身,TLS做出了一些使其更安全的改进。事实上,在客户端向服务器发起连接请求时,会附上的所支持的协议版本;这里的协议版本标识了是SSL或TLS(3.1为TLS)

2. TLS在真正传输过程中使用对称加密,因为对称加密效率更高。而对称加密所使用的key是在握手过程中使用特定的算法协商出来的。老版本的SSL使用RSA协商算法,需要使用服务器的公钥来加密传输客户端随机生成的对称key。这种方法有一些安全隐患(一个隐患就是攻击者可以先存储下来双方的加密包。如果攻击者后来获取了服务器的私钥,进而就能获取对称key,从而破解密文)。最新的Diffie-Hellman算法可以在协商过程中不传递任何关于对称key的信息,因而更加安全。

3. 客户端使用证书对服务器进行身份验证。证书一般由其他机构发放,证书会包含证书的公钥,并会在结尾处对证书内容做哈希并用发放机构自己的私钥对哈希值做加密(电子签名)。客户端可以用证书中发放机构的公钥对证书结尾的电子签名做解密,并验证解密出的哈希值与证书正文的哈希值是否一致,以验证证书是否确实为所宣称的发放机构发放。这个验证发放者的过程可以不断递归直到验证到的一个可信的发放者,或者电子签名验证失败。现在一般证书的格式都采用X509这个标准。

上面所述的过程只能验证证书本身的可信性,而不能验证提供这个证书的服务器实际上持有相关证书。关于如何验证服务器确实是证书的持有者,可能有两种方法:

1). 让服务器用证书中公钥对应的私钥加密一段文字,客户端用证书的公钥解密这段密文并验证服务器的私钥是否对应证书的公钥(如何防范人在回路?)

2). 验证证书中的CN与服务器的CN(基本上可以理解为域名)。因为客户端在发起向的某个服务器的连接过程中,客户端是知道自己想要连接到的服务器的域名的。而服务器传回的证书中包含证书被颁发者的信息,这里面就包含了被颁发者的域名。由于证书是由颁发者的私钥进行签名加密的,证书的内容被颁发者无法随意篡改,所以可以通过比对证书中的域名信息来验证对方是否是某个域名的服务器。

大体就是这几个关键点,以后有时间再补充细节。

参考资料:

https://developer.mozilla.org/en-US/docs/Archive/Security/Introduction_to_Public-Key_Cryptography#How_CA_Certificates_Are_Used_to_Establish_Trust

https://developer.mozilla.org/en-US/docs/Archive/Security/Introduction_to_SSL

http://chimera.labs.oreilly.com/books/1230000000545/ch04.html#TLS_FORWARD_SECRECY

http://blog.fourthbit.com/2014/12/23/traffic-analysis-of-an-ssl-slash-tls-session (非常详细解析协议每种message的格式,重点推荐!!)

关于openssl编程:

http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s03.html

http://www.linuxjournal.com/node/5487/print

http://www.ibm.com/developerworks/library/l-openssl/

https://www.cs.utah.edu/~swalton/Documents/Articles/Programming-OpenSSL.pdf

关于session resumption:

http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html

TLS协议扫盲(握手,非对称加密,证书,电子签名等)的更多相关文章

  1. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  2. HTTPS协议、TLS协议、证书认证过程解析

    一.HTTPS 协议 HTTPS协议其实就是HTTP over TSL,TSL(Transport Layer Security) 传输层安全协议是https协议的核心. TSL可以理解为SSL (S ...

  3. 探究公钥、私钥、对称加密、非对称加密、hash加密、数字签名、数字证书、CA认证、https它们究竟是什么,它们分别解决了通信过程的哪些问题。

    一.准备 1. 角色:小白.美美.小黑. 2. 剧情:小白和美美在谈恋爱:小黑对美美求而不得.心生怨念,所以从中作梗. 3. 需求:小白要与美美需通过网络进行通信,联络感情,所以必须保证通信的安全性. ...

  4. HTTPS协议,TLS协议

    一.HTTPS 协议 HTTPS协议其实就是HTTP over TSL,TSL(Transport Layer Security) 传输层安全协议是https协议的核心. TSL可以理解为SSL (S ...

  5. SSL/TLS协议概览

    SSL/TLS协议是什么 计算机网络的OSI七层模型和TCP/IP四层模型想必大家都知道.其中SSL/TLS是一种介与于传输层(比如TCP/IP)和应用层(比如HTTP)的协议.它通过"握手 ...

  6. TLS协议分析

    TLS协议分析 本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...

  7. 假如让你来设计SSL/TLS协议,你要怎么设计呢?

    摘要:本文将从设计者的视角介绍如何一步步设计出一个简易版的 SSL/TLS 的过程,在文章的最后,再简单介绍 TLS 1.2 版本的工作机制,以此帮助大家对 SSL/TLS 协议的基本原理有一个更深入 ...

  8. 【转】Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

    本文转自:http://www.wjdiankong.cn/wireshark%E5%92%8Cfiddler%E5%88%86%E6%9E%90android%E4%B8%AD%E7%9A%84tl ...

  9. android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

    一.前言 在之前一篇文章已经介绍了一款网络访问软件的破解教程,当时采用的突破口是应用程序本身的一个漏洞,就是没有关闭日志信息,我们通过抓取日志获取到关键信息来找到突破口进行破解的.那篇文章也说到了,如 ...

随机推荐

  1. linux shell执行原理

    shell简介 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. 运行背景 a 一个基本的linux系统结构 b.由上图可以看出,shel ...

  2. 如何获取Android应用的packageName和ActivityName,识别应用中的控件

    1.获取Android应用的packageName和ActivityName A:adb logcat >log.txt 在log中搜索package B:adb shell  logcat | ...

  3. 棋盘分割(二维区间DP)

    题目大意:给一个棋盘,棋盘上每个格子中都有一个值,现在需要将棋盘切成n个矩形,总共切n-1刀,求最小的均方差.均方差定义为:,其中. 题目分析:将均方差化简得到:均方差2=(Σxi2)/n-平均值2. ...

  4. 在页面和请求中分别使用XML Publisher生成PDF报表且自动上传至附件服务器

    两个技术要点: 1.使用TemplateHelper.processTemplate方法生成目标PDF的InputStream流,再使用ftp中上传流的方法将其上传至附件服务器. 2.在请求中调用AM ...

  5. 049——VUE中使用animation与transform实现vue的动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. [转]Ubuntu默认root用户密码

    Ubuntu默认root用户密码 在试验的过程中,安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下. 到网上搜了一下,原来是这么回事:Ubuntu的默认root密码 ...

  7. Date、DateFormat、SimpleDateFormat、Calendar

    package com.Date; import java.util.Date; /* * Date 表示特定的瞬间,精确到毫秒 * JDK1.0开始 * 构造方法(常用的方法,过时的不管): * D ...

  8. 用 PHPMailer 发送邮件

    REFs http://gohom.win/2015/07/02/PHPmailer/ http://blog.wpjam.com/m/phpmailer/ https://www.kancloud. ...

  9. emmc boot_config文件不存在

    /******************************************************************************* * emmc boot_config文 ...

  10. alsa-lib、alsa-utils移植

    /************************************************************************** * alsa-lib.alsa-utils移植 ...