【发布时间】:2021-09-01 02:56:43
【问题描述】:
我正在尝试使用 .Net Core Clean Architecture App Template 并让它在容器中运行并通过 azure CI/CD 管道进行部署
我有模板的容器化版本在 linux 容器中本地运行,端口为 5001,一切正常。
我的 azure 管道构建过程正常工作,它在我的容器注册表中创建映像。
问题是一旦我部署/发布到容器的 Web 应用程序,应用程序失败并抛出以下错误:
应用程序启动异常 System.InvalidOperationException:在 'CurrentUser\My' 上找不到主题为 'CN=localhost' 的有效证书 Microsoft.AspNetCore.ApiAuthorization.IdentityServer.SigningKeysLoader.LoadFromStoreCert(字符串 主题, String storeName, StoreLocation storeLocation, DateTimeOffset currentTime)
我做了什么:
-
在these docs from MS 之后,我创建了一个本地开发证书:
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p { password here }dotnet dev-certs https --trust -
然后我将其作为私有 .pfx 证书导入到 Web 应用程序中。
-
我添加了一个应用程序设置 WEBSITE_LOAD_CERTIFICATES 与证书的“thumb”值
-
我在 Identity Server appSettings.json 部分中使用了导入证书的“主机名”(在我的例子中是主机名=localhost)
当 Web 应用程序加载时,它显示 :( 应用程序错误和 docker 日志给了我上面引用的错误。
我很确定这与身份服务器设置和此处的 appSettings.json 值有关:
"IdentityServer": {
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=localhost"
}
}
谁能帮我弄清楚如何解决这个错误?
编辑 1 - 手动指定 IdentityServer 密钥文件
这肯定与身份服务器有关。我尝试手动将证书设置为 appSettings.json 中的文件,如下所示:
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "aspnetapp.pfx",
"Password": "Your_password123"
}
}
现在我收到此错误:
使用存储标志在“/app/aspnetapp.pfx”加载证书文件 ''。应用程序启动异常 System.InvalidOperationException: 加载证书时出错。文件 '/app/aspnetapp.pfx' 未找到。 Microsoft.AspNetCore.ApiAuthorization.IdentityServer.SigningKeysLoader.LoadFromFile
我将此添加到 dockerfile 中:
WORKDIR /app
COPY ["/aspnetapp.pfx", "/app"]
RUN find /app
如下图所示,文件显示在应用的构建目录中:
我还确保 .gitignore 或 .dockerignore 文件不会忽略 aspnetapp.pfx。
我不知道为什么它不会加载这个文件。它似乎就在它应该存在的地方。
使用证书拇指和更新路径编辑 2
所以我使用了 tnc1977 建议并将其作为身份密钥的设置
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "/var/ssl/private/<thumb_value>.p12",
"Password": "Your_password123"
}
}
但是,这又出现了另一个错误:
加载证书时出错。要么是密码 不正确或进程没有权限将密钥存储在 键集“EphemeralKeySet” 互操作+加密+OpenSslCryptographicException:错误:23076071:PKCS12 routines:PKCS12_parse:mac 验证失败
编辑 3:有效的 Azure 应用证书
我购买了 Azure 应用证书并添加了一个设置了 TSL 的自定义域,但出现了相同的错误
编辑 4:在代码 startup.cs 中加载证书 - 新错误:
我现在知道我不能使用证书存储 CurrentUser/My,因为它适用于 Windows。 Linux 容器必须在代码中手动加载证书。
我正在使用已添加到 Azure Web 应用程序的应用程序证书的指纹。它是一个私有 azure 应用程序证书,并且已针对自定义域进行了验证。
我将此代码添加到我的 statup.cs 配置服务中(我知道硬编码这些值不是最佳做法,但我想看看它是否可以加载证书,我将查看环境变量和密钥库):
// linux file path for private keys
var cryptBytes = File.ReadAllBytes("/var/ssl/private/<thumbprint>.p12");
var cert = new X509Certificate2(cryptBytes, "");
services.AddIdentityServer().AddSigningCredential(cert);
我输入了一个空白密码,因为我认为这是您应该做的。我现在在我的 docker 日志中收到以下错误,这使我相信已加载证书,现在该错误与我使用 services.AddIdentityServer().AddSigningCredential(cert); 相关 在 startup.cs configureservices 和 app.UseIdentityServer() 在 startup.cs configure:
未处理的异常。 System.InvalidOperationException:装饰器已注册类型:IAuthenticationService。
我不确定如何将证书添加到 app.UseIdentityServer();行。
编辑 5
经过更多的挖掘,不幸的是@tnc1997 答案将不起作用。 在 asp.net core 3 中调用 app.UseIdentityServer 在我的 satrtup.cs 内部崇敬一种将寻找身份服务器密钥的方法,在 appsetting(environment).json 文件中的 File,Pass 等。
因此,即使我在 tnc1997 显示的代码中加载了证书,应用程序仍会在设置文件中查找。因此设置文件必须包含 IS4 密钥的正确详细信息。
此外,azure 不会将证书放置在 linux 容器中典型的受信任位置。根据我的阅读,似乎唯一的方法是安装一个卷(在这种情况下是一个 azure 存储文件共享)并使用上传到该文件共享的证书。
我可以确认这在本地工作,但现在我在运行容器时仍然遇到问题,前端加载并且似乎 web api 项目没有启动。我将发布另一个问题来解决这个问题。
【问题讨论】:
-
嗨,J King,您提到您在本地使用的是 Linux 容器,能否确认您在 Azure 中使用的是 Windows 容器?
-
@tnc1997 你好,azure中的容器是linux容器
-
您有没有找到实际的解决方案?使用密码和自签名证书在 appsettings.json 中一切正常……直到我升级了 Identity Server……
-
@ZaneClaes 还没有。仍在努力中
-
我也陷入了同样的陷阱。身份服务器是一群不友好的人,他们会推动你寻求商业支持。我想编写自己的 oauth 身份验证并忘记这个传奇......它的总 b/s
标签: azure docker azure-devops azure-pipelines identityserver4