写点什么

吃透 HTTP 原理,教你建立安全的 HTTPS 网站

发布于: 22 小时前

1、讲解 Python Web 开发,必定离不开 HTTP。有多少人知道 HTTP 的工作流程呢?

2、我们访问网站,网站服务器把内容反馈给我们。网站服务器是什么?

3、都说 HTTP 网站不安全,要变成 HTTPS 的。如何建立 HTTPS 网站?

本文就针对以上问题做简单解答,更详细的内容请阅读《Python 高效开发实战――Django、Tornado、Flask、Twisted(第 3 版)》一书。

PART.

01


HTTP 流程

HTTP 是 Web 浏览器与 Web 服务器之间通信的标准协议,是 Internet 上能够可靠地交换文件的重要基础。HTTP 的基本交互流程如图 1 所示。



图 1 HTTP 的基本交互流程

每个 HTTP 站点都有一个服务器进程监听着 TCP 的 HTTP 端口,HTTP 端口默认为 80,也可由服务器进程设置为其他端口。

当服务器发现有客户端建立连接并提交了一个 HTTP 请求(Request)后,就根据请求的内容执行相应的操作,并将结果返回给客户端(Response)。

通常客户在浏览器中发起一次网络访问的步骤如下。

(1)输入网址并按 Enter 键,比如访问 http://mysite:8080/app/index.html。

(2)浏览器通过域名系统查询 mysite 的真实 IP,比如 212.34.98.20。

(3)向服务器 212.34.98.20 的 8080 端口发起 TCP 连接请求并建立连接。

(4)发送 HTTP 请求的内容,包括访问的地址/app/index.html、访问方式 GET、浏览器本身的产品名等。

(5)服务器返回/app/index.html 中的数据作为 Response 发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端。

(6)浏览器接收到结果后关闭与服务器的 TCP 连接。

(7)浏览器将接收到的结果呈现在显示器上。

注意:域名解析本身不是 HTTP 的一部分,客户端应在向服务器建立 TCP 连接之前就通过 DNS 服务器完成域名解析工作。

以上是最典型的 HTTP 流程,当今的 HTTP 版本还允许客户端在一次 HTTP 请求完成后不关闭 TCP 连接,以便第 2 次发送 HTTP 请求时复用该连接,从而达到减少系统整体开销的目的,此技术在 HTTP 中叫作 keep-alive。


PART.

02


基于 HTTP 的网站开发

经过几十年的发展,已经出现几个成熟的处理 HTTP 的知名 Web 服务器。

这些 Web 服务器可以解析(handle)HTTP,当 Web 服务器接收到一个 HTTP 请求时,会根据配置的内容返回一个静态 HTML 页面或者调用某些代码动态生成返回结果。

Web 服务器把动态响应(dynamic response)产生的委托(delegate)给其他一些程序,例如 Python 代码、JSP(JavaServer Pages)脚本、Servlets、ASP(Active Server Pages)脚本等。

无论它们的目的如何,这些服务器端(server-side)的程序通常会产生一个 HTTP 响应让浏览器浏览。

由于目标操作系统、应用场景及商业目的的不同,当今主流的 Web 服务器各有特色,将它们的特性简单地概括如下。

  • Apache:是世界上用得最多的 Web 服务器,市场占有率达 60%左右。由于其卓越的性能,Tomcat 或 JBoss 等很多其他 Web 服务器使用 Apache 为自己提供 HTTP 接口服务。

  • Nginx:是一款轻量级、高性能的 HTTP 和反向代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

  • IIS:微软的 Web 服务器产品。由于 Windows 的影响,IIS 是目前最流行的 Web 服务器产品之一,它的最大优势当然是对微软 ASP.net 及其周围产品的支持。

  • Tomcat:是一个开源服务器,是 Java Servlet 2.2 和 JavaServer Pages 1.1 技术的标准实现。

  • JBoss:是一个管理 EJB 的容器和服务器,支持 EJB 1.1、EJB 2.0 和 EJB 3 的规范。但 JBoss 的核心服务不包括支持 Servlet、JSP 的 Web 容器,一般与 Tomcat 或 Jetty 绑定使用。

当前的主流 Web 服务器都实现了主流语言的可调用接口标准,这些标准如下。

  • CGI:Common Gateway Interface,CGI 规范允许 Web 服务器执行外部程序,并将它们的输出发送给 Web 浏览器,CGI 将 Web 的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

  • ISAPI:Internet Server Application Program Interface,是微软提供的一套面向 Web 服务的 API 接口,它能实现 CGI 提供的全部功能,并在此基础上进行了扩展,例如提供了过滤器应用程序的接口。

  • WSGI:Web Server Gateway Interface,是一套专为 Python 语言制定的网络服务器标准接口。本书将要学习的 Python Web 框架均以 WSGI 为基础标准。

从客户端浏览器的角度来看,它的每次访问是通过 HTTP 访问 Web 服务器从而获得某种服务(下载文件、查看页面、订购商品等)的,但实际上 Web 服务器仅起到桥梁的作用,即将浏览器的 HTTP 请求解码,转换成服务器端程序能够识别的接口调用方式,然后将服务器端程序生成的返回封装成 HTTP Response,并返回给浏览器。

服务器端程序、Web 服务器、客户端之间的关系如图 2 所示。



图 2  服务器端程序

最简单的服务器端程序可以是直接读取某文件或返回固定的网页内容;稍复杂一些的服务器端程序需要处理客户端通过 HTTP、URL、HTML 中传入的参数、动态执行逻辑代码、在数据库或缓存中读写数据等一系列操作,才能最终生成调用结果。


PART.

03


实战演练

建立安全的 HTTPS 网站

普通 HTTP 站点的协议与数据以明文方式在网络上传输,而 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的 HTTP 通道,即在 HTTP 下加入 SSL 层,通过 SSL 达到数据加密及身份认证的功能。

目前几乎所有的银行、证券、公共交通的网站均以 HTTPS 方式搭建。

OpenSSL 是一个强大的免费 Socket 层密码库,蕴含了主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议。目前大多数网站通过 OpenSSL 工具包搭建 HTTPS 站点,其步骤如下。

  • 在服务器中安装 OpenSSL 工具包。

  • 生成 SSL 密钥和证书。

  • 将证书配置到 Web 服务器。

  • 在客户端安装 CA 证书。

本节演示在 Linux Ubuntu 下 OpenSSL 的使用方法,以及 Nginx 在 Linux 下的证书配置方式。

Windows 中 OpenSSL 的使用方式与 Linux 中的完全一致,读者可以自行尝试。

1.在服务器中安装 OpenSSL 工具包

通过如下两条命令安装 OpenSSL:



# sudo apt-get install openssl# sudo apt-get install libssl-dev
复制代码

命令运行成功后,OpenSSL 命令和配置文件将被安装到 Linux 系统目录中。

  • OpenSSL 命令:/usr/bin/openssl。

  • 配置文件:/usr/lib/ssl/*。

2.生成 SSL 密钥和证书

通过如下步骤生成 CA 证书 ca.crt、服务器密钥文件 server.key 和服务器证书 server.crt:













// 生成CA 密钥# openssl genrsa -out ca.key 2048// 生成CA证书,days参数以天为单位设置证书的有效期。在本过程中会要求输入证书的所在地、公司名、站点名等# openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt// 生成服务器证书RSA的密钥对# openssl genrsa -out server.key 2048// 生成服务器端证书CSR,本过程中会要求输入证书所在地、公司名、站点名等# openssl req -new -key server.key -out server.csr// 生成服务器端证书 ca.crt# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
复制代码

上述命令生成服务器端证书时,必须在 Common Nanme(CN)字段中如实输入站点的访问地址。即如果站点通过 www.mysite.com 访问,则必须定义 CN=www.mysite.com;如果通过 IP 地址访问,则需设置 CN 为具体的 IP 地址。

3.配置 Nginx HTTPS 服务器

在站点配置文件/etc/nginx/sites-enabled/default 中添加如下 server 段,可以定义一个基于 HTTPS 的接口,该接口的服务器端程序仍旧为 uWSGI 接口 127.0.0.1:3011。













server {listen       443;       # HTTPS服务端口server_name 0.0.0.0;      # 本机上的所有IP地址ssl                  on;ssl_certificate  /etc/nginx/ssl/server.crt;ssl_certificate_key  /etc/nginx/ssl/server.key;
location \ {uwsgi_pass http://127.0.0.1:3011;}}
复制代码

其中需要注意的是参数 ssl_certificate 和 ssl_certificate_key 需要分别指定生成的服务器证书和服务器密钥的全路径文件名。

至此,我们已经可以使用浏览器访问服务器的 443 端口进行 HTTPS 加密通信了。

再也不用为如何学习 Python 迷茫了,《Python 高效开发实战——Django、Tornado、Flask、Twisted(第 3 版)》一书本着“纯碎干货,实用至上”的原则,让我们成为真正的全栈开发人才。



▊《Python 高效开发实战——Django、Tornado、Flask、Twisted(第 3 版)

刘长龙 著


  • 畅销书 Python Web 编程集大成之作,全面升级

  • Python 3.8、Django 3、Tornado 6、Flask 1.1.2、Twisted 20

  • 作者多年 Python 项目实践经验及代码编写技巧分享

  • 助你零基础完成网站搭建、数据库设计、前后端开发


本书分为 3 篇:上篇是 Python 基础,带领初学者实践 Python 开发环境,掌握基本语法,同时对网络协议、Web 客户端技术、数据库建模等网络编程基础进行深入浅出的学习;中篇是 Python 框架,学习当前***的 Python Web 框架,即 Django、Tornado、Flask 和 Twisted,达到对各种 Python 网络技术融会贯通的目的;下篇是 Python 框架实战,分别使用 4 种框架进行项目实践,利用其各自的特点开发适用于不同场景的网络程序。本书内容精练、重点突出、实例丰富、讲解通俗,是广大网络应用设计和开发人员不可多得的一本参考书。


python高效开发二维码.png


(京东满 100 减 50,快快扫码抢购吧!)

用户头像

还未添加个人签名 2019.10.21 加入

还未添加个人简介

评论

发布
暂无评论
吃透HTTP原理,教你建立安全的HTTPS网站