热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTPS那些事儿(一)-HTTPS原理

HTTPS那些事儿(一)最近看了《http权威指南》的几个章节,对HTTPS有了部分了解,同时在网上查阅了一些资料,遂打算记录一下心得,写的仓促,肯定有很多错误的地方,欢迎大家指正。

HTTPS那些事儿(一)

最近看了《http权威指南》的几个章节,对HTTPS有了部分了解,同时在网上查阅了一些资料,遂打算记录一下心得,写的仓促,肯定有很多错误的地方,欢迎大家指正。


1.HTTP是什么

那么在介绍https之前,有必要先解释下http。http是一个非常简单又非常复杂的协议,说其简单,是我们每天都在用它,而且又浑然不觉,貌似很简单的样子。但是真正能够把http完全了解清楚,并不是很容易的事情。《http权威指南》诺厚的一本书,都是http相关内容,可知有多么复杂了。

  • 简单来说,HTTP协议是超文本传输协议,是一种可靠的数据传输协议。像我们每天都在使用的web浏览器就是一种http客户端,提供内容的web服务器就是服务器端。http客户端和服务器端构成了万维网的基本组件。web服务器是web资源的宿主,web资源是web内容的源头,最简单的web资源就是web服务器文件系统中的静态文件,如文本文件,html文件,图片,word文件以及mp3,avi等影音文件等;除了静态文件,web资源还可能是根据需要生产内容的软件程序,这些可以看做是动态文件。
  • 一个简单的http请求是从我们打开浏览器,输入url地址访问指定网站开始的。一条请求命令和一个响应结果构成了一个HTTP事务。而几乎世界上所有的HTTP通信都是由TCP/IP协议承载的,这就是我们熟悉的网络ISO七层结构和TCP/IP4层结构,在大部分的情况我们只讨论TCP/IP分层结构。那么具体的访问过程是怎么样的呢?比如我们访问http://movie.douban.com/subject/10485647/?from=showing 这个链接地址,那么具体包括如下几个过程:
    • 1.浏览器解析初主机名。(主机名是movie.douban.com)
    • 2.浏览器查询DNS服务器查到该主机名对应的ip地址。比如211.147.4.32。如果之前有访问过该站点,则由于DNS记录会被操作系统缓存,就不需要再次解析。此外,如果访问的web服务器使用了DNS轮转的话,则可能不同的时候查到的ip地址是不同的。
    • 3.浏览器获得端口号。这里默认是80.
    • 4.浏览器发起到211.147.4.32端口80的连接。
    • 5.浏览器向服务器发起一条HTTP GET的报文。
    • 6.浏览器从服务器读取一条HTTP响应报文。
    • 7.浏览器关闭连接。
  • 更加详细的过程可以参加《HTTP权威指南》,里面有讲到为了提高性能的并发连接、持久连接以及连接管道化等。此外,这里还有篇文章详细介绍了一个HTTP事务的过程,请参见从输入URL到页面加载完成发生了什么事情

2.从HTTP到HTTPS

基本的HTTP在web事务中是不够安全的,这也就催生了HTTPS的诞生。HTTPS是在HTTP和TCP之间加了一层传输层的密码安全层-SSL或者后来普遍使用的TLS。HTTPS协议会对web通信过程中的数据加密,杜绝了数据被窃取,总体来说还是很安全的。虽然前不久openssl爆出了一个heartbleed漏洞,不过现在已经修复了。HTTPS在URL中的前缀是HTTPS,默认端口是443,HTTP默认端口80。

2.1基本过程

    由于SSL安全层的存在,HTTPS建立安全传输的过程会略微复杂一些。HTTP客户端(最常用的就是浏览器了)打开一条到web服务器端口443的连接。一旦建立了TCP连接,客户端和服务器端就会初始化SSL层,对加密参数进行沟通并交换密钥。握手完成后,SSL也就初始化完成了,客户端就可以把请求报文发送给安全层了。当然,这些报文发送给TCP之前,会被加密。

2.2 SSL握手

  • SSL握手是最为复杂的一步了,具体过程如下:
  • 1.客户端(通常就是web浏览器)向服务器发送自己支持的加密规则并请求证书。
  • 2.服务器选择一组加密算法和HASH算法,以及服务器证书发送给浏览器。(SSL支持双向认证,web服务器将服务器证书发送给客户端,然后再将客户端的证书回送给服务器。但是实际应用中很多用户都没有自己的客户端证书,因此服务器也很少会要求客户端证书)
  • 3.浏览器获取服务器证书之后需要验证证书的合法性。具体有以下几个步骤: 服务器证书一般包括如下信息:证书序列号,证书过期时间,站点组织名,站点DNS主机名,站点的公开密钥,证书颁发者名称,证书颁发者的签名。网景公司提出了一种web服务器证书有效性算法是大部分浏览器有效验证服务器证书的基础。主要验证步骤如下:
    • 3.1 日期检测。
      检查证书的起始时间和结束时间,以确保证书仍然有效。如果证书过期了或者还没有被激活,则证书有效性验证失败,浏览器提示错误信息。
    • 3.2 证书颁发者可信度检测。
      每个证书都是由某些证书颁发机构(CA)签发的,它们负责为服务器担保。证书有不同等级,每种证书都需要不同级别的背景验证。任何人都可以生成证书,但是有些CA是非常著名的组织,它们可以通过非常清晰的流程来验证证书申请人的身份以及商业行为的合法性。因此,浏览器通常会附带一个签名颁发机构的受信列表。如果是未知机构颁发的证书,则浏览器会显示警告信息。
    • 3.3 签名检测。 一旦判定证书颁发者可信,浏览器就需要使用证书颁发者的公钥对信息进行签名,并将其与证书中的签名进行比对,如果两者不同,则信息可能被修改过,不能通过验证。
    • 3.4 站点身份认证
      为防止服务器复制其他人的证书,或拦截其他人的流量,大部分浏览器都会试着去验证证书中包含的DNS主机名是否与正在对话的主机名是否匹配。如果不匹配,则要么是浏览器警告用户,要么就是直接终止连接。对于虚拟主机(一台服务器有多个主机名)站点上的安全流量处理是比较棘手的,有些流行的web服务器程序只支持一个证书,如果用户请求虚拟主机名,则与证书中的主机名不匹配,这样浏览器会发出警告。一个处理办法是在开始安全事务前,将虚拟主机域名重定向至服务器证书中的官方主机名。(服务器证书中通常只包含一个主机名,但有些CA会为一组服务器创建一些包含了服务器名称列表或者通配域名的证书)
  • 4.如果服务器证书验证通过,则浏览器会生成一串随机的数字作为密码(实际用作密码的随机字符串生成过程比较复杂,这里简化了其过程。具体可以参加HTTPS那些事儿(二)),并用服务器证书中的公钥进行加密。 此外,浏览器使用第2步中商量好的HASH算法对握手消息进行加密,采用的密码就是刚刚生成的那串随机数字。最后将这些信息(用公钥加密的随机数密码,握手消息,采用HASH算法、随机数密码加密的握手消息签名)发送给服务器。
  • 5.服务器接收浏览器信息,需要进行如下处理:
    • 5.1 用私钥解密获取随机数密码。
    • 5.2 用HASH算法根据该随机数密码对握手消息进行签名,比对浏览器发来的签名和该计算得到的签名是否一致。
    • 5.3 如果签名验证通过,则使用该随机数密码加密一段握手消息,发送给浏览器。
  • 6.浏览器接收握手消息并使用随机数密码以及之前的HASH算法计算握手消息的HASH值。如果与发来的HASH值一致,此时握手结束,后续的消息都会通过随机数密码来进行加密和解密,使用的加密方法是对称加密。要注意之前的公钥加密和私钥解密使用的是非对称加密算法。

3.HTTPS中用到的算法

HTTPS一般使用的加密与HASH算法如下:   

非对称加密算法:RSA,DSA/DSS

对称加密算法:AES,RC4,3DES

HASH算法:MD5,SHA1,SHA256

非对称加密算法用于之前在传递随机数密码的时候用到。对称加密算法是安全连接建立后用到,用于加快加密解密的速度。HASH算法是用于验证SSL握手过程数据完整性。SSL握手过程中如果有任何错误,都会使连接断开,从而阻止了隐私信息的传输。由于HTTPS非常安全,攻击者很难找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,这些假证书的识别方法在第2节中已经有说明。


4.参考资料

  • HTTPS那些事一
  • 《HTTP权威指南》14章 安全HTTP

推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
tommy来了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有