Python Flask 中 ssl_context 个选项的区别

Difference between ssl_context options in Python Flask

为了在 Python Flask 中支持 https,必须在 app.run() 命令中指定 ssl_context 选项。

它是documented这样的:

ssl_context – 连接的 SSL 上下文。 ssl.SSLContext,形式为 (cert_file,pkey_file) 的元组,字符串 'adhoc'(如果服务器应自动创建),或 None 禁用SSL(默认设置)。

以下是列举的选项:

  1. ssl.SSLContext - 需要证书和密钥文件。
  2. 形式为 (cert_file, pkey_file) 的元组 - 需要证书和密钥文件。
  3. 字符串'adhoc' - 看起来很简单。

这些选项在这些上下文中有什么区别:

  1. 用户体验
  2. 额外模块和文件的安装
  3. 安全

对于前两个选项,您提供自己的证书,该证书可能(应该)由公认的机构或您的客户签署(如果您管理它们(如果您的应用程序部署在上下文中,就会发生这种情况)您可以在每台计算机上安装证书的位置,或者如果您的客户端不是 Web 浏览器而是您的应用程序,您可以随附证书)。

这将向用户显示他正在与真实服务器通信,而不是与试图窃听流量的人通信。

第三个选项将创建一个自签名证书,在这方面不向用户提供任何保证。

在用户体验方面,当客户端是 Web 浏览器时使用自签名证书会引发有关证书有效性的令人担忧的消息,并且会出现类似 "serious web sites would not ask you to blindly accept an unknown certificate" 的消息。

综上所述,你有3个选项(最后你的选项1和2是一样的):

  • 选项 1 和 2 带有由公认机构签署的证书:public Web 应用程序/网站的唯一好的解决方案。
  • 选项 1 和 2 带有您自己的证书(或由您自己的授权机构签名),部署在每个客户端上:当您可以在每个客户端上安装证书时,这是一个很好的解决方案。如果您必须要求您的客户这样做,这是一个糟糕的解决方案。
  • 选项 3:在实验室中进行测试的良好解决方案。在我能想到的任何其他情况下都是糟糕的解决方案。

3. Security 是唯一重要的,答案是“从不 在生产中使用 Werkzeug/Flask 开发服务器。” ssl_context 选项是为了在测试期间提供方便,但生产应用程序应该使用真实的应用程序和 Web 服务器,例如 uWSGI 以及 Nginx,适当配置 Nginx 以提供真实的 TLS 证书。