【问题标题】:Blazor with SSL on Ubuntu and Certbot在 Ubuntu 和 Certbot 上使用 SSL 的 Blazor
【发布时间】:2020-09-28 01:35:22
【问题描述】:

这是我的问题:如何使用 Certbot (Let's Encrypt) 生成的证书让 Kestrel 的两个同时实例(在同一域上的 Apache 后面)绑定到它们各自的 SSL 端口。我真的需要按照我找到的几篇文章的建议绑定应用程序中的所有端点吗?

这是背景:

我在 Ubuntu 18 上的 Apache 服务器后面有一个包含三个 dotnet 应用程序的域。这些应用程序在我的开发环境中运行,即 Windows 10 上的 Visual Studio 19。

这些应用程序是:MVC 主站点应用程序,它本质上是一个博客、一个 Blazor 游戏和一个控制游戏的 API。该 API 还被主站点用于协调玩家之间的游戏。

MVC 和 Blazor 应用都使用身份框架并访问相同的用户数据库。 Apache 将对根的请求重定向到 MVC 应用程序,并将 /blazor 前面的任何内容重定向到 blazor 应用程序。因此,如果用户登录到主应用程序,浏览器 cookie 应该允许该用户继续游戏而无需再次登录。

我了解到 Blazor 需要 SSL 进行身份验证,并且在我的 DEV 环境中,应用程序只需使用 UseUrls 调用即可绑定到 ssl 端口。它们都工作正常,但是......

问题在于部署。

在服务器上执行 Blazor 应用会导致:无法配置 HTTPS 终结点。不用说,将 UseUrls 调用更改为不使用 SSL 意味着身份验证失败。

现在,我的服务器使用 Certbot 并且可以提供到 Apache 的安全连接,并且 MVC 前端工作正常(应用程序本身不是 https)。

我一直在研究 SSL,发现很多关于使用 dotnet 设置 SSL 的文章。似乎没有人谈论反向代理情况。他们似乎都没有谈论域内的多个应用程序。在 Let's Encript 的情况下,建议应用程序应该自己获取和更新证书。如果其中一个应用程序仅可从特定端点使用,那么最后一个选项似乎将成为挑战。不同的证书不是意味着登录详细信息会在应用之间丢失吗?

我想指定 Certbot 证书并让 Kestrel 绑定到两个前端应用程序上指定的端口。

任何人都可以建议最好的前进方式或向我指出可能有帮助的文章吗?

【问题讨论】:

    标签: .net apache ubuntu blazor certbot


    【解决方案1】:

    好的。整理好了。

    需要做的第一件事是将 /etc/letsencrypt/live/domain/ 中的 fullchain.pem 和 privkey.pem 组合成 Kestrel 所需的 .pfx 文件:

    sudo openssl pkcs12 -export -out https-le.pfx -inkey live/domain/privkey.pem -in live/domain/fullchain.pem
    

    这将提示输入密码。这将需要允许 Kestrel 访问该文件。而且,说到访问,文件需要具有适当的文件权限。我将文件复制到 /usr/share/ca-certificates/dotnet/ 然后更改了文件权限:

    sudo chmod 644 https-le.pfx
    

    下面是我在 Startup.cs 的 ConfigureServices() 方法中使用的代码。我选择在此位置配置 Kestrel,以便轻松访问环境变量和 appsettings.json。

                 byte[] localhost = { 127, 0, 0, 1 };
                 IPAddress address = new IPAddress(localhost);
                 options.Listen(address, Int32.Parse(Configuration["GnomePorts:Https"]), listenOptions =>
                 {
                     if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != "Development")
                         listenOptions.UseHttps(Configuration["SSL_Cert:Path"],
                                                 Configuration["SSL_Cert:Password"]);
                     else
                         listenOptions.UseHttps();
                 });
    

    接下来,证书应该在本地受信任。我将 fullchain.pem 文件复制到 /usr/share/ca-certificates/dotnet/http-le.crt (文件类型是可互换的)并更改了它的权限:

    sudo chmod 644 https-le.crt
    

    然后像这样更新受信任的证书:

    sudo dpkg-reconfigure ca-certificates
    

    这将允许您选择将哪些证书添加到受信任的证书捆绑文件中。

    接下来,要允许 Apache 转发到 SSL 连接,应将 SSLProxyEngine 设置为 on 并将 SSLCACertificateFile 指向捆绑文件:

    SSLProxyEngine on
    SSLCACertificateFile /etc/ssl/certs/ca-certificates.crt
        ProxyPass /gnomes https://127.0.0.1:5003/gnomes
        ProxyPassReverse /gnomes https://127.0.0.1:5003/gnomes
    
        ProxyPass / https://127.0.0.1:5001/
        ProxyPassReverse / https://127.0.0.1:5001/
    

    请注意,这是在端口 443 的虚拟主机中完成的,并且 SSLEngine 已由 certbot 添加的包含设置为开启。

    完成所有这些后,应用程序将愉快地绑定到 SSL,Apache 将成功重定向。

    如果您尝试这样做,请不要忘记 Let's Encrypt 证书会在 90 天后过期,因此您可以考虑安排一个脚本在主证书更新时更新文件。

    除此之外:

    在我的问题中,我写道:MVC 和 Blazor 应用程序都使用身份框架并访问相同的用户数据库。 Apache 将对根的请求重定向到 MVC 应用程序,并将 /blazor 前面的任何内容重定向到 blazor 应用程序。因此,如果用户登录到主应用程序,浏览器 cookie 应该允许该用户继续游戏而无需再次登录。

    我发现需要对这两个应用程序进行进一步配置才能获得此功能。

    两个应用程序都必须有权访问身份验证 cookie 的共享密钥文件,并且 cookie 需要有一个通用名称。将以下代码添加到两个应用程序中的 Startup.cs:

        services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo("{keyfilepath}"))
            .SetApplicationName("CommonAppName");
        }
    
        services.ConfigureApplicationCookie(options => {
            options.Cookie.Name = ".AspNet.SharedCookie";
        });
    

    请注意,这仅适用于 dotnet 核心应用程序。

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2017-04-28
      • 2020-09-13
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多