特定域的多个SSL证书-Flask

特定域的多个SSL证书-Flask,ssl,flask,Ssl,Flask,我有一个目录来存储证书,并将域存储在一个数据库中,其中包含它们的SSL证书路径 例如,我有: certs_dir: - localhost1.pem - localhost1.key - localhost2.pem - localhost2.key 我有两个不同的域,比如localhost1/index和localhost2/index,它们都托管在同一个Flask应用程序上 我希望每个域使用它自己的SSL 有可能吗?如果是的话,怎么办 我不想使用ssl\u上下文运行

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

例如,我有:

certs_dir:
   - localhost1.pem
   - localhost1.key
   - localhost2.pem
   - localhost2.key
我有两个不同的域,比如
localhost1/index
localhost2/index
,它们都托管在同一个Flask应用程序上

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

有可能吗?如果是的话,怎么办


我不想使用
ssl\u上下文运行flask应用程序,我想在中间件中查找路由的ssl证书,并决定在响应请求时使用哪个证书,从而选择在任何HTTP交换之前显示哪个证书

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

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


因此,不,您的情况是,只有URL中的本地路径发生更改(就像问题的原始版本:
localhost/cert1
vs
localhost/cert2
)不能引发单独的证书。如果您使用不同的主机名:
realm1.example.com
realm2.example.com

TLS握手,并因此在任何HTTP交换之前选择要显示的证书,则可以这样做

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

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


因此,不,您的情况是,只有URL中的本地路径发生更改(就像问题的原始版本:
localhost/cert1
vs
localhost/cert2
)不能引发单独的证书。如果您使用不同的主机名,您可以这样做:
realm1.example.com
realm2.example.com

谢谢您的回答,不同的域是我想说的,我对问题进行了一些编辑,如果有不同的域,是否可以这样做?如何设置?如果主机名不同,则通常可能是。我不知道您的特定框架是如何实现的。基于Flask和Werkzeug中缺乏此类案例的文档,以及后者中的连接启动方式(请参阅),我认为不可能实现您想要的功能,至少在配置级别不可能。您需要覆盖
BaseWSGIServer.\uuuu init\uuuuu
并使用
SSLContext.set\u servername\u callback
从Python
ssl
模块获取SNI期间给定的主机名,并在此时建立正确的SSLContext,当客户端正在连接时,另一种选择是在应用程序前面放置一个Web服务器,如nginx或Apache,并让TLS在那里终止。然后,从它到您的应用程序,它是纯HTTP流量,不需要证书。这当然有安全问题。谢谢你的回答,不同的域是我想说的,我编辑了一点问题,如果有不同的域,是否可以这样做?如何设置?如果主机名不同,则通常可能是。我不知道您的特定框架是如何实现的。基于Flask和Werkzeug中缺乏此类案例的文档,以及后者中的连接启动方式(请参阅),我认为不可能实现您想要的功能,至少在配置级别不可能。您需要覆盖
BaseWSGIServer.\uuuu init\uuuuu
并使用
SSLContext.set\u servername\u callback
从Python
ssl
模块获取SNI期间给定的主机名,并在此时建立正确的SSLContext,当客户端正在连接时,另一种选择是在应用程序前面放置一个Web服务器,如nginx或Apache,并让TLS在那里终止。然后,从它到您的应用程序,它是纯HTTP流量,不需要证书。这当然涉及安全问题。