摘要:一般http中存在请求信息明文传输,容易被窃听截取;数据的完整性未校验,容易被篡改;没有验证对方身份,存在冒充危险。面对这些问题,怎么破?

一、为什么要用https

一般http中存在如下问题:请求信息明文传输,容易被窃听截取;数据的完整性未校验,容易被篡改;没有验证对方身份,存在冒充危险。

HTTPS又有哪些优势?

1、使用HTTPS可认证用户和服务器,确保数据发送到正确的客户机和服务器。

2、HTTPS是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

3、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

二、https中的证书是什么

CA:证书授权中心( certificate authority)类似于国家出入境管理处一样,给别人颁发护照;也类似于国家工商管理局一样,给公司企业颁发营业执照。它有两大主要性质:

  • CA本身是受信任的,国际认可的;
  • 给他受信任的申请对象颁发证书。 和办理护照一样,要确定你的合法身份,你不能是犯罪分子或造反派。当然,你需要被收保护费,同时,CA可以随时吊销你的证书。

CA 的证书 ca.crt 和 SSL Server的证书 server.crt 是什么关系呢?

  • SSL Server 自己生成一个 私钥/公钥对,server.key/server.pub 。server.pub 生成一个请求文件 server.req。 请求文件中包含有 server 的一些信息,如域名/申请者/公钥等。
  • server 将请求文件 server.req 递交给 CA,CA验明正身后,将用 ca.key和请求文件加密生成 server.crt由于 ca.key 和 ca.crt 是一对, 于是 ca.crt 可以解密 server.crt。
  • 在实际应用中:如果 SSL Client 想要校验 SSL server.那么 SSL server 必须要将他的证书 server.crt 传给 client.然后 client 用 ca.crt 去校验 server.crt 的合法性。如果是一个钓鱼网站,那么CA是不会给他颁发合法server.crt证书的,这样client 用ca.crt去校验,就会失败。

三、生成证书与密钥

shell脚本

#!/bin/bash

PROJECT_NAME="https Project"

# Generate the openssl configuration files.
cat > ca_cert.conf << EOF
[ req ]
distinguished_name = req_distinguished_name
prompt = no [ req_distinguished_name ]
O = $PROJECT_NAME Certificate Authority
EOF cat > server_cert.conf << EOF
[ req ]
distinguished_name = req_distinguished_name
prompt = no [ req_distinguished_name ]
O = $PROJECT_NAME
CN =
EOF cat > client_cert.conf << EOF
[ req ]
distinguished_name = req_distinguished_name
prompt = no [ req_distinguished_name ]
O = $PROJECT_NAME Device Certificate
CN =
EOF mkdir ca
mkdir server
mkdir client # 生成私钥
openssl genrsa -out ca.key 1024
openssl genrsa -out server.key 1024
openssl genrsa -out client.key 1024 # 根据私钥创建证书请求文件,需要输入一些证书的元信息:邮箱、域名等
openssl req -out ca.req -key ca.key -new -config ./ca_cert.conf
openssl req -out server.req -key server.key -new -config ./server_cert.conf
openssl req -out client.req -key client.key -new -config ./client_cert.conf # 结合私钥和请求文件,创建自签署证书
openssl x509 -req -in ca.req -out ca.crt -sha1 -days 5000 -signkey ca.key
openssl x509 -req -in server.req -out server.crt -sha1 -CAcreateserial -days 5000 -CA ca.crt -CAkey ca.key
openssl x509 -req -in client.req -out client.crt -sha1 -CAcreateserial -days 5000 -CA ca.crt -CAkey ca.key mv ca.crt ca.key ca/
mv server.crt server.key server/
mv client.crt client.key client/ rm *.conf
rm *.req
rm *.srl

一些命令的解释

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [numbits]

选项说明:
-out filename:将生成的私钥保存至filename文件,若未指定输出文件,则为标准输出。
-numbits:指定要生成的私钥的长度,默认为1024。该项必须为命令行的最后一项参数。
-des|-des3|-idea:指定加密私钥文件用的算法,这样每次使用私钥文件都将输入密码,太麻烦所以很少使用。
-passout args:加密私钥文件时,传递密码的格式,如果要加密私钥文件时单未指定该项,则提示输入密码。传递密码的args的格式 openssl req -out ca.req -key ca.key -new -config ./ca_cert.conf
主要命令选项:
-new :说明生成证书请求文件
-key :指定已有的秘钥文件生成秘钥请求,只与生成证书请求选项-new 配合。
-out :指定生成的证书请求或者自签名证书名称 openssl x509 -req -in ca.req -out ca.crt -sha1 -days 5000 -signkey ca.key
openssl x509命令具以下的一些功能,例如输出证书信息,签署证书请求文件、生成自签名证书、转换证书格式等。
-in filename:指定证书输入文件,若同时指定了"-req"选项,则表示输入文件为证书请求文件,再使用"-signkey"提供自签署时使用的私钥。
-out filename:指定输出文件
-days: 指定证书的有效时间长短。缺省为30天

四、安装flask

需要安装python 的 openssl 的类库,使用pip 安装

pip install pyOpenSSL

五、https单向认证握手流程

python实现

server端:

from flask import Flask
app = Flask(__name__) @app.route('/login')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run(host="0.0.0.0", port=8091, ssl_context=('server.crt', 'server.key'))

客户端:

import urllib.request

import ssl

if __name__ == '__main__':
CA_FILE = "ca.crt"
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.check_hostname = False
context.load_verify_locations(CA_FILE)
context.verify_mode = ssl.CERT_REQUIRED
try:
request = urllib.request.Request('https://127.0.0.1:8091/login')
res = urllib.request.urlopen(request, context=context)
print(res.code)
print(res.read().decode("utf-8"))
except Exception as ex:
print("Found Error in auth phase:%s" % str(ex))

六、https双向认证握手流程

python实现

客户端:

from flask import Flask, request, Response
import json app = Flask(__name__)
@app.route("/login")
def hello():
return "Hello World!"
@app.route('/login1', methods=['POST'])
def login():
username = request.form.get("username")
password = request.form.get("password")
login_config = {
"name": "pwd1"
}
if username in login_config.keys():
if password == login_config[username]:
return Response(json.dumps(True), status=200, mimetype='application/json') return Response(json.dumps(False), status=200, mimetype='application/json')
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8091, ssl_context=('server/server.crt', 'server/server.key'))

客户端:

import urllib.request

import ssl

if __name__ == '__main__':
CA_FILE = "ca.crt" context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.check_hostname = False
context.load_verify_locations(CA_FILE)
context.verify_mode = ssl.CERT_REQUIRED
dict = {
"username": "name",
"password": "pwd1",
}
data = urllib.parse.urlencode(dict).encode('utf-8')
try:
request = urllib.request.Request('https://127.0.0.1:8091/login')
res = urllib.request.urlopen(request, context=context)
print(res.code)
print(res.read().decode("utf-8"))
except Exception as ex:
print("Found Error in auth phase:%s" % str(ex))
try:
request = urllib.request.Request('https://127.0.0.1:8091/login1', data=data, method='POST')
res = urllib.request.urlopen(request, context=context)
print(res.code)
print(res.read().decode("utf-8"))
except Exception as ex:
print("Found Error in auth phase:%s" % str(ex))

参考链接

openssl 命令(1): openssl req 命令详解

openssl简介-指令x509

openssl 命令(3): openssl x509命令详解

OpenSSL命令—pkcs12

十分钟搞懂HTTP和HTTPS协议?

Https单向认证和双向认证

python关于SSL/TLS认证的实现

本文分享自华为云社区《https如何使用python+flask来实现》,原文作者:SNHer 。

点击关注,第一时间了解华为云新鲜技术~

https如何使用python+flask来实现的更多相关文章

  1. AFNetworking+Python+Flask+pyOpenSSL构建iOS HTTPS客户端&服务器端

    对于HTTPS我在网上找了一堆资料看了下, 各种协议和证书已经有点晕了 最后我现有的感觉是, 在HTTP服务器上放一个证书, 在原本的HTTP访问之前客户端先检查证书是否正确 如果客户端证书检查正确, ...

  2. 【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https

    问题描述 在上篇博文"[Azure 应用服务]App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)"中,实现了通过 HT ...

  3. windows下python+flask环境配置详细图文教程

    本帖是本人在安装配置python和flask环境时所用到的资源下载及相关的教程进行了整理罗列,来方便后面的人员,省去搜索的时间.如果你在安装配置是存在问题可留言给我. 首先罗列一下python+fla ...

  4. [Python][flask][flask-login]关于flask-login中各种API使用实例

    本篇博文跟上一篇[Python][flask][flask-wtf]关于flask-wtf中API使用实例教程有莫大的关系. 简介:Flask-Login 为 Flask 提供了用户会话管理.它处理了 ...

  5. Taffy Web开发,Python Flask实践详解

    1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能. 2. 实现细节 页面使用Python Flask +Bootstrap开发,还 ...

  6. 细数Python Flask微信公众号开发中遇到的那些坑

    最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...

  7. 前端和后端的数据交互(jquery ajax+python flask+mysql)

    上web课的时候老师布置的一个实验,要求省市连动,基本要求如下: 1.用select选中一个省份. 2.省份数据传送到服务器,服务器从数据库中搜索对应城市信息. 3.将城市信息返回客户,客户用sele ...

  8. 个人学期总结及Python+Flask+MysqL的web建设技术过程

    一个学期即将过去,我们也迎来了2018年.这个学期,首次接触了web网站开发建设,不仅是这门课程,还有另外一门用idea的gradle框架来制作网页. 很显然,用python语言的flask框架更加简 ...

  9. Taffy自动化测试框架Web开发,Python Flask实践详解

    1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能.   本页面适用所有基于taffy/nose框架编写的自动化测试脚本,或基于un ...

随机推荐

  1. now-go时间百宝箱

    golang不像C#,Java这种高级语言,有丰富的语法糖供开发者很方便的调用.所以这便催生出很多的开源组件,通过使用这些第三方组件能够帮助我们在开发过程中少踩很多的坑. 时间处理是所有语言都要面对的 ...

  2. MySQL like查询使用索引

    在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来.这个时候查询的效率就 ...

  3. Linux文件常用指令

    目录 Linux文件常用指令 1.pwd 显示当前目录 2.cd 切换目录 3.mkdir 创建目录 4.touch 修改或创建文件 5.ls 显示目录下的内容 6.cat 查看文件信息 7.echo ...

  4. docker ssh秘钥免密登录

    一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...

  5. 关于安装VMware以及Linux操作系统过程

    想用Linux完成部分教学作业,虚拟机是少不了的,所以首先选择了VMware进行安装. VMware在官网下载之后,就可以直接打开安装,但是在安装过程中,建议不要勾选启动时检查产品更新和加入VMwar ...

  6. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

  7. Flutter Web 支持现已进入稳定版

    作者 / Mariam Hasnany, Product Manager, Flutter 我们对 Flutter 的愿景是成为一个可移植的 UI 框架,在全平台上构建精美的应用体验.做为 Flutt ...

  8. 冒泡算法及其优化(java)

    冒泡算法的规则: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完 动态图: 对应代码 static void swap(i ...

  9. Apache配置 5.访问日志不记录静态文件

    介绍:项目中的CSS.图片.js都是静态文件.一般会将静态文件放到一个单独的目录中,以方便管理. 1. 配置 # vim /usr/local/apache2.4/conf/extra/httpd-v ...

  10. 2019HDU多校第六场 6641 TDL

    一.题目 TDL 二.分析 题意就是找一个$n$满足题目中的公式,找不到就输出$-1$. 对于$${( f (n,m) - n )} \oplus {n} =k$$ 可以转换一下变成$( f (n,m ...