【问题标题】:how to add security context to flask?如何向烧瓶添加安全上下文?
【发布时间】:2015-05-12 11:57:00
【问题描述】:

我试图向一个简单的烧瓶应用程序添加一个安全上下文

import flask
import ssl

app = flask.Flask(__name__)


@app.route('/', methods=['GET'])
def home():
    return "<h1>THIS IS HOME</h1>"


ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
ctx.load_cert_chain('crt-key-crs/download-system.crt', 'crt-key-crs/download-system.key')

if __name__ == '__main__':
    app.run(debug=True, use_reloader=False, ssl_context=ctx)

在输入密码后运行它时出现以下错误:

Traceback (most recent call last):
  File "flask-test.py", line 16, in <module>
    app.run(debug=True, use_reloader=False, ssl_context=ctx)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 710, in run_simple
    inner()
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 692, in inner
    passthrough_errors, ssl_context).serve_forever()
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 486, in make_server
    passthrough_errors, ssl_context)
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 425, in __init__
    self.socket = tsafe.Connection(ssl_context, self.socket)
  File "/usr/lib/python3/dist-packages/OpenSSL/tsafe.py", line 11, in __init__
    self._ssl_conn = apply(_ssl.Connection, args)
NameError: name 'apply' is not defined

然后我在文档中发现 apply(function, *args, **kwargs) 被替换为 function(*args, **kwargs) 所以我去了文件/usr/lib/python3/dist-packages/OpenSSL/tsafe.py 并在运行时手动修改了该行再次出现以下错误:

Traceback (most recent call last):
  File "flask-test.py", line 16, in <module>
    app.run(debug=True, use_reloader=False, ssl_context=ctx)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 710, in run_simple
    inner()
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 692, in inner
    passthrough_errors, ssl_context).serve_forever()
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 486, in make_server
    passthrough_errors, ssl_context)
  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 425, in __init__
    self.socket = tsafe.Connection(ssl_context, self.socket)
  File "/usr/lib/python3/dist-packages/OpenSSL/tsafe.py", line 11, in __init__
    self._ssl_conn = _ssl.Connection(*args)
  File "/usr/lib/python3/dist-packages/OpenSSL/SSL.py", line 804, in __init__
    raise TypeError("context must be a Context instance")
TypeError: context must be a Context instance

在此之后并且知道 apply 已从 python3.x 中完全删除,我使用 python2.7.9 运行我的应用程序以检查我在修改该行时是否做错了,显然我没有做错,因为同样的错误再次发生。那么,为了在我的烧瓶应用程序中使用安全上下文,我需要做什么或更改我的代码?提前致谢。

【问题讨论】:

    标签: python-3.x ssl flask


    【解决方案1】:

    经过大量搜索和测试,我发现代码是可以的,问题是Werkzeug服务器的版本。我用sudo pip3 install Werkzeug --upgrade 升级了,现在它工作正常。

    【讨论】:

    • 在 2015 年 1 月 30 日的 0.10.0 的 Werkzeug 更改日志 cmets 中:“- 使用 stdlib ssl 模块而不是 OpenSSL 用于内置服务器(问题 #434)。这意味着 OpenSSL不再支持上下文,而是来自标准库的ssl.SSLContext。”因此,要使用 python stdlib ssl,您需要 Werkzeug 0.10.0 或更高版本
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2019-01-04
    • 2015-09-14
    • 2019-01-02
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多