你可以将HTTPS功能添加到python烧瓶Web服务器吗?

rob*_*obm 32 python rest https flask

我正在尝试构建一个Web界面,以便在网络设备上模拟一个安静的界面,这个网络设备使用摘要式身份验证和HTTPS.我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以告诉我如何评论我需要使用下面的代码来实现这一点.

from flask import Flask, jsonify

app = Flask(__name__)


@app.route('/')
def index():
    return 'Flask is running!'


@app.route('/data')
def names():
    data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
    return jsonify(data)


if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

小智 24

这也适用于紧要关头

from flask import Flask, jsonify


from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')




app = Flask(__name__)


@app.route('/')
def index():
    return 'Flask is running!'


@app.route('/data')
def names():
    data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
    return jsonify(data)


#if __name__ == '__main__':
#    app.run()
if __name__ == '__main__':  
     app.run(host='127.0.0.1', debug=True, ssl_context=context)
Run Code Online (Sandbox Code Playgroud)

  • SSLv3有POODLE漏洞.将其更改为TSL (9认同)
  • 对于较新的 Python,此用于创建“上下文”的代码已被弃用。试试这个: ```import ssl context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain('certificate.crt', 'private.key')``` (8认同)
  • 您是说TLS不是TSL? (4认同)
  • 我认为这里的 API 已经过时了。[我的回答如下](/sf/answers/4560666841/) 给出了一个与 Python 3.7.5 一起使用的版本。 (2认同)

ana*_*thi 19

from flask import Flask, jsonify
import os

ASSETS_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)


@app.route('/')
def index():
    return 'Flask is running!'


@app.route('/data')
def names():
    data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
    return jsonify(data)


if __name__ == '__main__':
    context = ('local.crt', 'local.key')#certificate and key files
    app.run(debug=True, ssl_context=context)
Run Code Online (Sandbox Code Playgroud)

永远不要使用openssl或pyopenssl它现在成为python中的obselete

  • 要生成`local.crt`和`local.key`,请参阅方法2:http://kracekumar.com/post/54437887454/ssl-for-flask-local-development (2认同)
  • 很奇怪,它的运行地址为http://127.0.0.1:5000/。这不应该在安全的http上运行吗?我仍然可以在http://127.0.0.1:5000/上获取 (2认同)

Eve*_*ews 12

对于快速的脏自签名证书,您还可以使用flask run --cert adhoc或设置FLASK_RUN_CERTenv var。

$ export FLASK_APP="app.py"
$ export FLASK_ENV=development
$ export FLASK_RUN_CERT=adhoc

$ flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on https://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 329-665-000
Run Code Online (Sandbox Code Playgroud)

adhoc选项没有很好的文档记录(有充分的理由,永远不要在生产中这样做),但在cli.py 源代码 中提到了它。

Miguel GrinbergRunning Your Flask Application Over HTTPS中对此进行了彻底的解释。


Mar*_*ers 10

在真实的Web服务器上部署Flask,而不是使用内置(开发)服务器.

请参阅Flask文档的" 部署选项"一章.像Nginx和Apache这样的服务器都可以处理为您的站点设置HTTPS服务器而不是HTTP服务器.

列出的独立WSGI服务器通常会在代理转发配置中部署在Nginx和Apache之后,前端服务器仍为您处理SSL加密.

  • @ Alexis.Rolland:内置服务器无法应对互联网的“现实世界”,它既没有通过安全POV进行战斗,也没有对其性能进行调整。它的主要目的是在本地计算机上引导开发,仅此而已。在生产环境中使用它需要您自担风险,我认为这是相当大的风险。 (2认同)
  • 使用真正的网络服务器并不总是一种选择,我只想用 Flask 和 https 提供一些文件 (2认同)

小智 9

  • 要在flask应用程序中运行https功能或SSL身份验证,请首先使用以下命令安装“ pyOpenSSL” python软件包:

     pip install pyopenssl
    
    Run Code Online (Sandbox Code Playgroud)
  • 下一步是在终端上使用以下命令创建“ cert.pem”和“ key.pem”:

     openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
    
    Run Code Online (Sandbox Code Playgroud)
  • 在烧瓶应用程序项目中复制生成的“ cert.pem”和“ kem.pem”

  • 在app.run()中添加ssl_context =('cert.pem','key.pem')

例如:

    from flask import Flask, jsonify

    app = Flask(__name__)

    @app.route('/')

    def index():

        return 'Flask is running!'


    @app.route('/data')

    def names():

        data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}

        return jsonify(data)

  if __name__ == '__main__':

        app.run(ssl_context=('cert.pem', 'key.pem'))
Run Code Online (Sandbox Code Playgroud)


Hem*_*lli 7

如果此网络服务器仅用于测试和演示目的。您可以使用 ngrok,它也是一个开源的隧道,用于传输您的 http 流量。

基本上,ngrok 创建一个公共 URL(http 和 https),然后将流量隧道传输到 Flask 进程正在运行的任何端口。

https://ngrok.com/product

只需几分钟即可完成设置。您首先必须下载该软件。然后运行命令
./ngrok http [你的 python 进程正在运行的端口号]

然后它会在终端中打开一个窗口,为您提供 http 和 https url 来访问您的网络应用程序。


MJD*_*MJD 6

得分最高的答案有正确的想法,但 API 似乎已经发展到不再像 2015 年首次编写时那样有效。

代替这个:

from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')
Run Code Online (Sandbox Code Playgroud)

我在 Python 3.7.5 中使用了这个:

import ssl
context = ssl.SSLContext()
context.load_cert_chain('fullchain.pem', 'privkey.pem')
Run Code Online (Sandbox Code Playgroud)

然后在Flask.run调用中提供 SSL 上下文,因为它说:

app.run(…, ssl_context=context)

Run Code Online (Sandbox Code Playgroud)

(我的server.crt文件被称为fullchain.pem,我的文件被server.key称为privkey.pem。这些文件是由我的 LetsEncrypt Certbot 提供给我的。)


cam*_*ser 6

超级简单:

应用程序.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"
Run Code Online (Sandbox Code Playgroud)

跑步:

$ openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
$ flask run --cert=cert.pem --key=key.pem
Run Code Online (Sandbox Code Playgroud)