好的。整理好了。
需要做的第一件事是将 /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 核心应用程序。