You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask:自动获取或生成固定SHA-1指纹的方法求助

解决Flask HTTPS服务器SHA-1指纹随机问题的两种方案

针对你遇到的adhoc模式下SHA-1指纹随机生成、手动获取繁琐的问题,提供以下两种解决方案:

方案1:生成固定自签名证书,保持SHA-1指纹不变

adhoc模式会每次启动时生成临时证书,导致指纹随机。换成自定义固定证书即可解决:

  1. 生成自签名证书和私钥
    确保系统安装了OpenSSL,执行以下命令生成有效期10年的证书:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3650

执行时按提示填写信息,也可以直接回车跳过所有选项。生成的cert.pem是证书文件,key.pem是私钥文件,保存在当前目录。

  1. 修改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'))
  1. 获取固定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:23:15