查看原文
其他

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

刘长龙 博文视点Broadview 2022-06-02

👆点击“博文视点Broadview”,获取更多书讯

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种框架进行项目实践,利用其各自的特点开发适用于不同场景的网络程序。本书内容精练、重点突出、实例丰富、讲解通俗,是广大网络应用设计和开发人员不可多得的一本参考书。

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

抽奖赠书

按以下方式与博文菌互动,即有机会获赠《Python高效开发实战——Django、Tornado、Flask、Twisted(第3版)》一书!

活动方式:关注下方“博文视点Broadview”公众号,在后台回复“python抽奖”参与活动,届时会在参与的小伙伴中抽取1名幸运鹅!

活动时间:截至9月8日(周三)开奖。

快快拉上你的小伙伴参与进来吧~~



如果喜欢本文
欢迎 在看留言分享至朋友圈 三连


 热文推荐  





▼点击阅读原文,查看本书详情~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存