python & flask 下的https 实现

1)下载 openssl并安装,这里 下载的是 Win64OpenSSL-3_1_2.exe

from : Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

安装到: C:\OpenSSL-Win64

并 在系统设置中,在path中添加 : C:\OpenSSL-Win64\bin

2)打开cmd, 生成公私钥:(在要生成文件的地方打开cmd)

# 生成私钥

openssl genrsa -out ca.key 2048

openssl genrsa -out server.key 2048

openssl genrsa -out client.key 2048

# 根据私钥创建证书请求文件,需要输入一些证书的元信息

openssl req -new -key ca.key -out ca.csr

openssl req -new -key server.key -out server.csr

openssl req -new -key client.key -out client.csr

# 元信息(三个都一样)

Country Name (2 letter code) [AU]:CN

State or Province Name (full name) [Some-State]:GuanDong

Locality Name (eg, city) []:ShenZhen

Organization Name (eg, company) [Internet Widgits Pty Ltd]:SouthKing

Organizational Unit Name (eg, section) []:SouthKing

Common Name (e.g. server FQDN or YOUR name) []:SK

Email Address []:SK

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:qcrm.ssl

An optional company name []:qcrm.ssl

# 结合私钥和请求文件,创建自签署证书

openssl x509 -req -in ca.csr -out ca.crt -sha1 -days 5000 -signkey ca.key

openssl x509 -req -in server.csr -out server.crt -sha1 -CAcreateserial -days 5000 -CA ca.crt -CAkey ca.key

openssl x509 -req -in client.csr -out client.crt -sha1 -CAcreateserial -days 5000 -CA ca.crt -CAkey ca.key

在服务器中,需要: server.key, server.crt

这里,将其copy到 static/cert目录下,然后在 main.py中如下设置:

from flask import Flask, render_template, redirect, url_for, request

from gevent import pywsgi

import requests

import hashlib

。。。

if __name__ == "__main__":

server = pywsgi.WSGIServer(('192.168.0.101',8080),app,keyfile='./static/cert/server.key',certfile='./static/cert/server.crt')

server.serve_forever()

注: 可能需要安装 pyOnenSSL: pip install pyOpenSSL

web客户端则需要在地址栏中输入: https://192.168.0.101:8080, 如下:

如果是胖客户端,如使用python的客户端,则需要使用client.key; (此python代码可能有问题)

import urllib.request

import ssl

if __name__ == '__main__':
    CA_FILE = "./static/cert/ca.crt"

    context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    context.check_hostname = False
    context.load_verify_locations(CA_FILE)
    context.verify_mode = ssl.CERT_REQUIRED
    try:
        request = urllib.request.Request('https://192.168.0.101:8080')
        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))

  • 36
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在 Flask实现 Token 机制,可以使用 JWT(JSON Web Tokens)库。下面是一个简单的示例代码: ```python from flask import Flask, request from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' app.config['JWT_EXPIRATION_DELTA'] = timedelta(days=1) class User: def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}')" users = [ User(1, 'user1', 'password1'), User(2, 'user2', 'password2'), ] def authenticate(username, password): user = next((user for user in users if user.username == username), None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return next((user for user in users if user.id == user_id), None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return f'Hello, {current_identity}!' if __name__ == '__main__': app.run() ``` 在上面的代码中,我们首先定义了一个 `User` 类来存储用户信息。然后定义了一个 `authenticate` 函数来用于用户认证,它会查找用户列表中是否存在指定的用户名和密码。如果存在,则返回该用户对象。 接下来,我们定义了一个 `identity` 函数,它会根据 JWT 中存储的用户 ID 来查找用户对象。最后,我们创建了一个 `jwt` 对象,并将其绑定到 Flask 中。 最后,我们定义了一个受保护的路由 `/protected`,并使用 `@jwt_required()` 装饰器来保护它。这意味着在访问该路由时,用户必须先提供有效的 JWT 才能继续访问。 当用户成功提供有效的 JWT 且通过身份验证时,`current_identity` 会返回该用户对象,我们可以在响应中使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风尘无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值