• HTTP和HTTPS协议


    介绍

    http[1]是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是一种应用层协议,可用于将超文本服务器中文本、图片、音视频等内容传输到客户端浏览器。

    构建与互联网之上的万维网,其主要组成部分就是http协议。目前使用的最广泛的http协议版本是http1.1。

    最初的HTTP协议是万维网1991年诞生时,蒂姆·伯纳斯·李爵士(Sir Tim Berners-Lee)在European Organization for Nuclear Research使用的协议。之后万维网协会(World Wide Web Consortium)和Internet工作小组(Internet Engineering Task Force)合作,并最终发布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定义了我们今天普遍使用的HTTP协议的一个版本——HTTP1.1。

    在TCP/IP参考模型中和OSI参考模型中,http协议处于应用层的位置,http规定了客户端和Web服务端的通信协议,而html则规定了传输的内容的格式、类型。https是在http的基础上,增加了TLS/SSL协议,为通信内容进行加密操作。

    http通信过程

    http协议默认使用TCP的80端口进行通信。通过在浏览器中输入网站地址,URL (Uniform Resource Locator,统一资源定位符)[2],发起http请求。

    URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。URL的一般语法格式为:

    protocol:// hostname[:port]/path/[;parameters][?query]#fragment

    其中带方括号[]的为可选项。

    使用http协议,则url可以表示为

    http://www.xxx.com/index.html?type=main。

    在一次完整的http通信中,会经过如下几个过程[3]

    1. 浏览器向服务器发起tcp链接。通过url中的hostname[:port]信息,同响应的web服务器建立tcp通信连接。在此之前,还可能需要使用DNS协议,完成hostname到ip地址的转换。http是比tcp/ip更高层次的协议,只有当tcp连接建立之后才能进行http通信。http通信协议一般使用tcp的80端口,https一般使用tcp的443端口。
    2. 浏览器向服务器发送请求命令。tcp连接建立后,浏览器会向服务器发送请求命令,末尾追加一个换行符 ,例如GET /index.html  HTTP/1.1。常见的http请求方法有GET和POST。
    3. 浏览器向服务器发送请求头。浏览器发送完请求命令后,还要以请求头的方式向服务器发送一些辅助信息,这些信息以“键:值”的形式构成了请求头,每一个键值对通过换行符 分隔,请求头发送完后后,再发送一个空白行表示请求头发送完毕。
    4. 浏览器向服务器发送请求体。当浏览器进行POST操作时,发送完请求命令和请求头之后,还会以content-type请求头描述的形式发送请求体内容。请求体的长度在请求头content-length中有表明,服务器可通过此值获取全部请求体。
    5. 服务器发送应答状态。服务器接收到浏览器发送的请求命令和请求头后,进行http协议判断,请求内容查询,请求头逻辑判断等操作,向浏览器发送应答状态,末尾追加 换行符,例如HTTP/1.1 200 OK。
    6. 服务器发送应答头。服务器关于某一次浏览器请求的应答,还包含一些关于本次应答的而外信息,此信息以应答头的方式发送给浏览器。应答头的格式同请求头的格式相同,应答头发送完毕后,再发送一个空白行表示应答头发送完毕。
    7. 服务器发送应答数据。服务器发送完应答头后,会根据应答头中描述的content-type和content-length描述的形式,发送应答数据。
    8. 服务器关闭tcp连接。一般情况下,服务器传输完数据后,便会主动关闭tcp连接。如果请求头中包含“connection:keep-alive”信息,服务器则会在数据发送完毕后,仍保持tcp的打开状态,使得后续的http请求节省了tcp连接建立的时间,同时也节省了网络带宽。

    请求体和应答数据,都是二进制数据。通过content-type指定其格式内容以及编码。

    关于http的具体信息可参考HTTP 教程中的内容。

    http的缺点

    http的简答方便,在网络应用中广发使用,同时http还是存在着缺点的[4]

    1. 通信使用明文(不加密),内容可能会被窃听。由于http协议的所有内容,都是以明文的方式进行传输的,不仅可以被恶意窃听,并且可以窃听到传输内容的具体含义,如果传输内容进行了加密,则只能被恶意窃听,但需要经过复杂的手段才能获得传输的具体内容。
    2. 不验证通信方的身份,因此有可能遭遇伪装、冒充。
    3. 无法证明报文的完整性,所以有可能已遭篡改。
    4. 这些问题不仅在HTTP上出现,其他未加密的协议中也会存在这类问题。

    为了解决http的以上问题,浏览器可以使用https对http的所有内容进行加密,保证了

    1. 所有数据都是经过加密后进行传输,无法被第三方窃听到传输的真正内容;
    2. 由于配备了身份证书,防止了客户端或服务端的身份被冒充;
    3. 由于传输内容校验机制的存在,可发现传输的内容被篡改。

    https

    https并非是应用层的一种新协议,它只是在http通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。

    浏览器使用http时,直接同tcp通信;当浏览器使用https时,浏览器会先同TLS/SSL进行通信,然后TLS/SSL再同tcp进行通信。

    在使用TLS/SSL后,http便拥有了加密功能。TLS/SSL是独立于http的协议,所以其也可以同应用层的其他协议配合使用。

    TLS/SSL[5] 

    SSL由从前的网景公司开发,有1,2,3三个版本,但现在只使用版本3。

    TLS是SSL的标准化后的产物,有1.0 1.1 1.2三个版本。主流浏览器都已经实现了TLS 1.2的支持。

    TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。SSL是TLS旧的称呼。

    由于习惯问题,虽然现在都是使用TLS,但一直统称为TLS/SSL。

    加解密基础知识

    对传输内容进行加密,是增加http通信安全的第一步。

    可以采用对称加密(DES,AES),也可以采用非对称加密(RSA,DSA)。此外还有数字签名技术(MD5,SHA)。

    对称加密相比非对称加密,速度更快,需要的计算量更少。

    https通信流程

    1. 当浏览器向服务器请求一个安全的网页(通常是 https://) 时,服务器就把它的数字证书和公匙发送给浏览器。
    2. 浏览器检查证书是不是由可以信赖的机构颁发的,检查证书的数字签名是不是正确,确认证书有效和此证书是此属于指定网站的。 
    3. 浏览器使用证书中提供的公钥加密一个随机生成对称密钥,并用此对称密钥对http协议请求内容进行加密,加密后的信息一起发送到服务器。
    4. 服务器用自己的私匙解密浏览器发送过来的对称钥匙,然后用这把对称加密的钥匙解密加密过的http协议请求内容。 
    5. 服务器用对称钥匙对http协议响应内容进行加密,并发送给浏览器,浏览器通过对称密钥解密加密信息,获得http协议的响应内容。  

    https通信过程中使用到了对称加密、非对称加密和数字签名技术。

    其中非对称加密,在目前已有算力的情况下是无法破解的。原理是,两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难。这两个大素数,就是非对称加密中的公钥、私钥。

    在未使用数字证书保证服务端的公钥正确性时,依然存在中间人攻击的可能性,只要中间人作为客户端同实际服务端进行通信,作为服务端同实际客户端进行通信即可。客户端没有任何方法判断服务端发送过来的公钥是否为真正的公钥。于是在https通信中,使用到了数字证书,用于保证客户端可以获得正确的服务端公钥。

    数字证书[6]

    数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。

    数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。

    颁发过程

    数字证书颁发过程一般为:

    1. 用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。
    2. 认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来。
    3. 认证中心将发给用户一个数字证书,该证书内包含用户的个人信息、公钥信息,以及使用认证中心公钥计算获得的用户的个人信息和公钥的数字摘要的数字签名,认证中心的信息。

    数字证书原理[7]

    客户端获得了数字证书,通过使用认证中心的公钥对证书中用户的跟人信息以及公钥信息的数字摘要进行解密,获得数字签名,同证书中的数字签名进行对比,即可验证此证书的正确性。

    通过证书认证链,可以获得指定认证中心的公钥。

    证书中有颁发者的信息,以及其认证中心的信息,通过此种方式,可以获得一个认证中心的认证链。

    在认证链的最顶端是根认证中心,根认证中心的数字证书一般都是已经内置在操作系统或者浏览器中了,表示对此证书的绝对信任。

    通过根证书可以验证其子认证中心的证书的正确性,从而获得子认证中心的公钥,以此类推,直到获得指定认证中心的公钥。

    数字签名

    将指定报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。
    将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而“加密”后的报文即称数字签名。
    接收方收到数字签名后,用同样的HASH算法对原报文计算出报文摘要值,然后与用发送者的公开密钥对数字签名进行解密得到的报文摘要值相比较。
    如相等则说明报文确实来自所称的发送者。
    由于RSA加解密非常耗时,被加密的报文越大,耗得时间越多,因此对报文摘要进行加密,仍然能够起到同样的作用。这就是为什么多了个报文摘要。

    相关文件后缀

    * 证书:.crt .cer .pem
    * 私钥:.key
    * 证书请求:.csr

    把证书和私有key 放到同一个文件里边,这时候扩展名通常叫.pem。Java的keystore是自有格式。在生成私钥公钥后,如果需要申请证书,需要生成csr文件。

    https实践

    通过以上内容,能够初步了解https以及数字证书的工作原理。

    在https通信中,比原有的http通信,多了三个元素:公钥、私钥、证书。其中证书包含公钥内容。

    tomcat启用https

    1、首先使用jdk自带的keytool工具生成证书。[8]

    在windows的powershell或者linux的shell中,键入一下命令(keystore是证书保存位置)

    keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:	omcat.keystore" 
    

    根据提示输入必要的信息。  

    密钥库口令:123456(这个密码非常重要)
    名字与姓氏:192.168.0.110(以后访问的域名或IP地址,非常重要,证书和域名或IP绑定)
    组织单位名称:anything(随便填)
    组织名称:anything(随便填)
    城市:anything(随便填)
    省市自治区:anything(随便填)
    国家地区代码:anything(随便填)
    

    最后“是否正确?”中键入“y”和回车。此时证书已生成。

    2、应用证书到tomcat

    修改tomcat中的conf/server.xml文件。

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="D:/tomcat.keystore" keystorePass="123456" />
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

    3、测试tomcat的https

    启动tomcat,在浏览器中输入https协议格式的url地址。

      

    [1]. http://baike.baidu.com/item/http

    [2]. http://baike.baidu.com/link?url=GMLo1XhB34TUkdKPEXewjpBYsECNMqp4o0jYqTNZuTYYTJDoDVIomoWdDRlavPCaWpOH8cBDMy7vdpZELSMrrOxnRhfNt4kuoiSWYRYMUgO

    [3]. http://blog.csdn.net/u013087513/article/details/49465597

    [4]. http://book.51cto.com/art/201404/436093.htm

    [5]. http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

    [6]. http://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6

    [7]. http://www.2cto.com/article/201203/122095.html

    [8]. http://blog.csdn.net/xiaojunhu/article/details/8263687

    [9]. http://blog.sina.com.cn/s/blog_503506460100mdvt.html

  • 相关阅读:
    简化日常工作之三:自己写一个CI脚手架
    gearman的安装和配置
    简化日常工作系列之二 ----- 定时采集小说
    简化日常工作系列之一 ---- 自动新建每日记录
    代码简洁之四 统一抽象层次
    php处理金额显示的一些笔记
    代码简洁之三:减少注释 增加代码可读性
    通用性安装redis和基本配置
    写一个Redis封装类
    Exchange2010安装指南
  • 原文地址:https://www.cnblogs.com/mahuan2/p/6389093.html
Copyright © 2020-2023  润新知