【问题标题】:Multiple SSL certificates for specific domains - Flask特定域的多个 SSL 证书 - Flask
【发布时间】:2019-07-08 22:55:21
【问题描述】:

我有一个目录来存储证书,并将域及其 SSL 证书路径存储在数据库中

例如我有:

certs_dir:
   - localhost1.pem
   - localhost1.key
   - localhost2.pem
   - localhost2.key

我有 2 个不同的域,例如 localhost1/indexlocalhost2/index,它们都托管在同一个 Flask 应用程序上

我希望每个域都使用它自己的 SSL 使用 Flask

有可能吗?如果是,那么如何?

我不想使用 ssl_context 运行我的烧瓶应用程序,我想在我的中间件中查找路由的 SSL 证书,并在响应时决定使用哪个证书来处理此请求

【问题讨论】:

    标签: ssl flask


    【解决方案1】:

    TLS 握手,因此选择要出示的证书,发生在任何 HTTP 交换之前。

    只有在 HTTP 交换步骤中,客户端之间才会交换完整的 URL。在此之前,在 TLS 握手期间,客户端仅发送(通过 TLS SNI 扩展)它尝试联系的服务器的主机名

    因此,服务器只能根据请求的主机名来决定将哪个证书发送回客户端。

    所以,不,只有 URL 中的本地路径发生变化的情况(就像问题的原始版本一样:localhost/cert1localhost/cert2)不能引发单独的证书。如果您使用不同的主机名,您可以这样做:realm1.example.comrealm2.example.com

    【讨论】:

    • 感谢您的回答,我想说的是不同的域,我稍微编辑了问题,如果有不同的域可以这样做吗?怎么样?
    • 如果主机名不同,那么一般是可以的。我不知道你的具体框架是如何完成的。
    • 基于在 Flask 和 Werkzeug 中都缺乏此类情况的文档以及在后者中启动连接的方式(请参阅github.com/pallets/werkzeug/blob/master/src/werkzeug/…)我不相信有可能做你想做的事,至少不是在配置级别。您需要覆盖 BaseWSGIServer.__init__ 并使用 Python ssl 模块中的 SSLContext.set_servername_callback 来获取 SNI 期间给出的主机名,并在客户端连接时建立正确的 SSLContext...
    • 另一种方法是在您的应用程序前面放置一个网络服务器(例如 nginx 或 Apache)并让 TLS 在那里终止。然后从它到您的应用程序,它是纯 HTTP 流量,不需要证书。这当然有安全隐患。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2011-11-25
    • 2017-07-04
    • 2017-01-19
    • 2016-09-21
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多