gpt4 book ai didi

.net - 在 Ubuntu 和 Certbot 上使用 SSL 的 Blazor

转载 作者:行者123 更新时间:2023-12-04 09:42:12 27 4
gpt4 key购买 nike

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

这是背景:

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

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

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

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

问题在于部署。

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

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

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

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

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

最佳答案

好的。整理好了
需要做的第一件事是将/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 添加的包含设置为打开。
完成所有这些之后,应用程序将愉快地绑定(bind)到 SSL,Apache 将成功重定向。
如果您尝试此操作,请不要忘记 Let's Encrypt 证书会在 90 天后过期,因此您可以考虑安排一个脚本在更新主证书时更新文件。
除此之外:
在我的问题中,我写道:MVC 和 Blazor 应用程序都使用身份框架并访问相同的用户数据库。 Apache 将对根的请求重定向到 MVC 应用程序,并将/blazor 前面的任何内容重定向到 blazor 应用程序。因此,如果用户登录到主应用程序,浏览器 cookie 应该允许该用户继续游戏而无需再次登录。
我发现需要对这两个应用程序进行进一步配置才能获得此功能。
两个应用程序都必须有权访问身份验证 cookie 的共享 key 文件,并且 cookie 需要有一个通用名称。将以下代码添加到两个应用程序中的 Startup.cs:
    services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo("{keyfilepath}"))
.SetApplicationName("CommonAppName");
}

services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
请注意,这仅适用于 dotnet 核心应用程序。

关于.net - 在 Ubuntu 和 Certbot 上使用 SSL 的 Blazor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62273042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com