Python Flask:自动获取或生成固定SHA-1指纹的方法求助
解决Flask HTTPS服务器SHA-1指纹随机问题的两种方案
针对你遇到的adhoc模式下SHA-1指纹随机生成、手动获取繁琐的问题,提供以下两种解决方案:
方案1:生成固定自签名证书,保持SHA-1指纹不变
adhoc模式会每次启动时生成临时证书,导致指纹随机。换成自定义固定证书即可解决:
- 生成自签名证书和私钥
确保系统安装了OpenSSL,执行以下命令生成有效期10年的证书:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3650
执行时按提示填写信息,也可以直接回车跳过所有选项。生成的cert.pem是证书文件,key.pem是私钥文件,保存在当前目录。
- 修改Flask代码使用固定证书
将原代码中的ssl_context='adhoc'替换为证书和私钥的路径:
from flask import Flask, request app = Flask(__name__) @app.route("/", methods=["GET"]) def hello(): return "Hello World!" if __name__ == "__main__": # 使用固定证书启动服务器 app.run(host="0.0.0.0", port=8080, ssl_context=('cert.pem', 'key.pem'))
- 获取固定SHA-1指纹
用OpenSSL命令直接提取证书的SHA-1指纹:
openssl x509 -noout -fingerprint -sha1 -inform pem -in cert.pem
输出格式类似SHA1 Fingerprint=AA:BB:CC:...,将这个指纹配置到ESP8266即可,后续服务器重启指纹不会改变。
方案2:自动获取当前SHA-1指纹并写入文件
如果需要保留adhoc模式,或者需要动态获取当前证书的指纹,可以通过代码自动提取并保存到文件:
from flask import Flask, request import ssl import hashlib from flask._internal import _get_adhoc_ssl_context app = Flask(__name__) @app.route("/", methods=["GET"]) def hello(): return "Hello World!" def get_sha1_fingerprint(cert_bytes): # 计算证书的SHA-1指纹并格式化 sha1_hash = hashlib.sha1(cert_bytes).digest() return ':'.join(f'{b:02X}' for b in sha1_hash) if __name__ == "__main__": # 选择使用adhoc或固定证书 use_adhoc = True # 改为False则使用固定证书 if use_adhoc: # 获取Flask生成的adhoc SSL上下文 ssl_ctx = _get_adhoc_ssl_context() else: # 加载自定义固定证书 ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_ctx.load_cert_chain('cert.pem', 'key.pem') # 提取证书字节并计算指纹 cert_bytes = ssl_ctx.get_certificate() sha1_fingerprint = get_sha1_fingerprint(cert_bytes) # 将指纹写入文本文件 with open('sha1_fingerprint.txt', 'w', encoding='utf-8') as f: f.write(f"SHA-1 Fingerprint: {sha1_fingerprint}") print(f"指纹已保存到sha1_fingerprint.txt: {sha1_fingerprint}") # 启动服务器 app.run(host="0.0.0.0", port=8080, ssl_context=ssl_ctx)
运行代码后,当前目录会生成sha1_fingerprint.txt文件,里面直接包含服务器的SHA-1指纹,无需手动通过浏览器查看。
注意:
_get_adhoc_ssl_context是Flask内部函数,若后续Flask版本更新可能存在兼容性问题。如果担心这个,可以自己实现临时证书生成逻辑,不过该方法在当前主流Flask版本中均可正常使用。
内容的提问来源于stack exchange,提问作者Mannu
相关产品推荐
相关产品推荐

