HTTPS那个东西(一)-HTTPS原理

HTTPS那个东西(一)

最近看了《http权威指南》几个章节,对HTTPS随着节,了一些资料,遂打算记录一下心得。写的仓促,肯定有非常多错误的地方,欢迎大家指正。

1.HTTP是什么

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

  • 简单来说。HTTP协议是超文本传输协议,是一种可靠的传输数据协议。像我们每天都在使用的web浏览器就是一种httpclient,提供内容的webserver就是server端。httpclient和server端构成了万维网的基本组件。webserver是web资源的宿主。web资源是web内容的源头,最简单的web资源就是webserver文件系统中的静态文件,如文本文件,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.浏览器查询DNSserver查到该主机名相应的ip地址。比方211.147.4.32。假设之前有訪问过该网站,则因为DNS记录会被操作系统缓存,就不须要再次解析。此外,假设訪问的webserver使用了DNS轮转的话,则可能不同的时候查到的ip地址是不同的。
    • 3.浏览器获得port号。这里默认是80.
    • 4.浏览器发起到211.147.4.32port80的连接。
    • 5.浏览器向server发起一条HTTP GET的报文。
    • 6.浏览器从server读取一条HTTP响应报文。
    • 7.浏览器关闭连接。
  • 更加具体的过程能够參加《HTTP权威指南》。里面有讲到为了提高性能的并发连接、持久连接以及连接管道化等。此外。这里还有篇文章具体介绍了一个HTTP事务的过程,请參见从输入URL到页面载入完毕发生了什么事情

2.从HTTP到HTTPS

主要的HTTP在web事务中是不够安全的,这也就催生了HTTPS的诞生。HTTPS是在HTTP和TCP之间加了一层传输层的password安全层-SSL或者后来普遍使用的TLS。

HTTPS协议会对web通信过程中的数据加密,杜绝了数据被窃取。整体来说还是非常安全的。尽管前不久openssl爆出了一个heartbleed漏洞,只是如今已经修复了。

HTTPS在URL中的前缀是HTTPS,默认port是443,HTTP默认port80。

2.1基本过程

因为SSL安全层的存在,HTTPS建立安全传输的过程会稍微复杂一些。HTTPclient(最经常使用的就是浏览器了)打开一条到webserverport443的连接。

一旦建立了TCP连接,client和server端就会初始化SSL层,对加密參数进行沟通并交换密钥。握手完毕后,SSL也就初始化完毕了,client就能够把请求报文发送给安全层了。

当然,这些报文发送给TCP之前,会被加密。

2.2 SSL握手

  • SSL握手是最为复杂的一步了,详细步骤例如以下:
  • 1.client(通常就是web浏览器)向server发送自己支持的加密规则并请求证书。
  • 2.server选择一组加密算法和HASH算法,以及server证书发送给浏览器。

    (SSL支持双向认证。webserver将server证书发送给client。然后再将client的证书回送给server。可是实际应用中非常多用户都没有自己的client证书。因此server也非常少会要求client证书)

  • 3.浏览器获取server证书之后须要验证证书的合法性。详细有下面几个步骤: server证书一般包含例如以下信息:证书序列号,证书过期时间,网站组织名,网站DNS主机名,网站的公开密钥,证书颁发者名称。证书颁发者的签名。网景公司提出了一种webserver证书有效性算法是大部分浏览器有效验证server证书的基础。

    主要验证步骤例如以下:

    • 3.1 日期检測。

      检查证书的起始时间和结束时间,以确保证书仍然有效。假设证书过期了或者还没有被激活,则证书有效性验证失败,浏览器提示错误信息。

    • 3.2 证书颁发者可信度检測。

      每一个证书都是由某些证书颁发机构(CA)签发的,它们负责为server担保。

      证书有不同等级。每种证书都须要不同级别的背景验证。不论什么人都能够生成证书,可是有些CA是很著名的组织。它们能够通过很清晰的流程来验证证书申请人的身份以及商业行为的合法性。因此,浏览器一般会附带一个签名颁发机构的受信列表。假设是未知机构颁发的证书,则浏览器会显示警告信息。

    • 3.3 签名检測。 一旦判定证书颁发者可信。浏览器就须要使用证书颁发者的公钥对信息进行签名,并将其与证书中的签名进行比对,假设两者不同,则信息可能被改动过,不能通过验证。
    • 3.4 网站身份认证

      为防止server复制其它人的证书。或拦截其它人的流量,大部分浏览器都会试着去验证证书中包括的DNS主机名是否与正在对话的主机名是否匹配。

      假设不匹配,则要么是浏览器警告用户。要么就是直接终止连接。对于虚拟主机(一台server有多个主机名)网站上的安全流量处理是比較棘手的。有些流行的webserver程序仅仅支持一个证书,假设用户请求虚拟主机名,则与证书中的主机名不匹配,这样浏览器会发出警告。

      一个处理办法是在開始安全事务前,将虚拟主机域名重定向至server证书中的官方主机名。(server证书中通常仅仅包括一个主机名。但有些CA会为一组server创建一些包括了server名称列表或者通配域名的证书)

  • 4.假设server证书验证通过。则浏览器会生成一串随机的数字作为password(实际用作password的随机字符串生成过程比較复杂,这里简化了其过程。详细能够參加HTTPS那些事儿(二)),并用server证书中的公钥进行加密。 此外。浏览器使用第2步中商议好的HASH算法对握手消息进行加密,採用的password就是刚刚生成的那串随机数字。

    最后将这些信息(用公钥加密的随机数password,握手消息。採用HASH算法、随机数password加密的握手消息签名)发送给server。

  • 5.server接收浏览器信息,须要进行例如以下处理:
    • 5.1 用私钥解密获取随机数password。

    • 5.2 用HASH算法依据该随机数password对握手消息进行签名,比对浏览器发来的签名和该计算得到的签名是否一致。

    • 5.3 假设签名验证通过。则使用该随机数password加密一段握手消息。发送给浏览器。
  • 6.浏览器接收握手消息并使用随机数password以及之前的HASH算法计算握手消息的HASH值。假设与发来的HASH值一致。此时握手结束。兴许的消息都会通过随机数password来进行加密和解密。使用的加密方法是对称加密。要注意之前的公钥加密和私钥解密使用的是非对称加密算法。

3.HTTPS中用到的算法

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

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

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

HASH算法:MD5,SHA1,SHA256

非对称加密算法用于之前在传递随机数password的时候用到。

对称加密算法是安全连接建立后用到。用于加快加密解密的速度。HASH算法是用于验证SSL握手过程数据完整性。SSL握手过程中假设有不论什么错误,都会使连接断开。从而阻止了隐私信息的传输。因为HTTPS非常安全,攻击者非常难找到下手的地方,于是很多其它的是採用了假证书的手法来欺骗client。这些假证书的识别方法在第2节中已经有说明。

4.參考资料

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-18 15:39:59

HTTPS那个东西(一)-HTTPS原理的相关文章

你的MySQL服务器开启SSL了吗?SSL在https和MySQL中的原理思考

最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主要介绍MySQL5.7 SSL连接加密功能.如何使用?以及使用SSL的一些注意点. 我们知道,MySQL5.7之前版本,安全性做的并不够好,比如安装时生成的root空密码账号.存在任何用户都能连接上的test库等,导致数据库存在较大的安全隐患.好在5.7版本对以上问题进行了一一修复.与此同时,MyS

Https系列之一:https的简单介绍及SSL证书的生成

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 一:本文的主要内容介绍 https的介绍SSL证书的介绍自签名SSL证书介绍及生成方法CA证书介绍及申

https网站访问第三方https网站时候报错: The request was aborted:Could not create SSL/TLS secure channel.

https网站访问第三方https网站时候报错: The request was aborted:Could not create SSL/TLS secure channel. 解决办法: if(Url.StartsWith("https",StringComparison.OrdinalIgnoreCase))//https请求 { ServicePointManager.Expect100Continue = true; //如果是4.5以上版本可以直接使用 //ServiceP

SSL在https和MySQL中的原理思考

之前对HTTPS通信过程有过了解,HTTPS是应用HTTP协议使用SSL加密的版本,在TCP和HTTP之间增加SSL协议.通过握手阶段认证双方身份,协商对称秘钥对通信信息进行加密.此处只描述常用的服务器单向验证,大致过程简要描述如下: 0:事先Web服务器把自己的公钥和Web信息提交给权威CA,CA确认后,用自己的私钥将Web信息以及公钥的文摘签名,制成数字证书交给Web服务器:客户端Web浏览器事先安装被信任的权威CA的根证书(未签名证书或者自签名证书)1:客户端向服务器发起连接请求,协商使用

http与https的区别以及https的加密原理

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版. http与https的区别在于 http一般使用的是80端口,而https使用的是443端口 http协议需要ca证书 http是明文传输的,而https是通过ssl加密之后传输的. https使用的是非对称加密,所谓的非对称加密就是加密密钥与

HTTPS为什么安全 &分析 HTTPS 连接建立全过程

专题一:HTTPS为什么安全 1.http为什么不安全? http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持.监听.篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题. 可以把http通信比喻成寄送信件一样,A给B寄信,信件在寄送过程中,会经过很多的邮递员之手,他们可以拆开信读取里面的内容(因为http是明文传输的).A的信件里面的任何内容(包括各类账号和密码)都会被轻

Spring Boot工程支持HTTP和HTTPS,HTTP重定向HTTPS

本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密.非对称加密.信息认证等密码学知识.如果你不太了解,可以阅读Erlang发明人Joe Armstrong最近写的Cryptography Tutorial.大牛出品,通俗易懂,强力推荐. Https涉及到的主体 客户端.通常是浏览器(Chrome.IE.FireFox等),也可以自己编写的各种语言的

HTTP和HTTPS的区别及HTTPS加密算法

HTTP和HTTPS的概念              HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏     览器更加高效,使网络传输减少.http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持.监听.篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题. HTT

gitlab开启https加密 and 全站https

建立SSL目录, 然后拷贝你的证书到SSL目录: # mkdir /etc/gitlab/ssl  # chmod 700 /etc/gitlab/ssl # cp luck.crt luck.key /etc/gitlab/ssl/ 编辑/etc/gitlab/gitlab.rb文件, 修改成: external_url "https://www.abc.com" nginx['redirect_http_to_https'] = true nginx['ssl_certificat