我正在尝试使用.Net Core 干净架构应用程序模板 https://github.com/jasontaylordev/CleanArchitecture并使其在容器中运行并通过 Azure CI/CD 管道进行部署
我在 Linux 容器中本地运行模板的容器化版本,端口为 5001,一切运行良好。
我的天蓝色管道构建过程正常工作,它在我的容器注册表中创建图像。
问题一旦我部署/发布到容器的 Web 应用程序,该应用程序就会失败并抛出以下错误:
应用程序启动异常
System.InvalidOperationException:无法在“CurrentUser\My”上找到主题为“CN=localhost”的有效证书
Microsoft.AspNetCore.ApiAuthorization.IdentityServer.SigningKeysLoader.LoadFromStoreCert(字符串
主题、字符串 storeName、StoreLocation storeLocation、DateTimeOffset 当前时间)
我做了什么:
-
下列的这些文档来自 MS https://learn.microsoft.com/en-us/aspnet/core/security/docker-https?view=aspnetcore-3.1我创建了一个本地开发证书:
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p { password here }
dotnet dev-certs https --trust
-
然后我将其作为私有 .pfx 证书导入到 Web 应用程序中。
-
我添加了一个应用程序设置WEBSITE_LOAD_CERTIFICATES与证书的“拇指”值
-
我在 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
例程:PKCS12_parse:mac验证失败
编辑3:有效的Azure应用程序证书
我购买了 Azure 应用程序证书并添加了设置了 TSL 的自定义域,但出现了相同的错误
编辑4:在代码startup.cs中加载证书-新错误:
我现在知道我无法使用证书存储 CurrentUser/My 因为那是针对 Windows 的。 Linux 容器必须在代码中手动加载证书。
我正在使用已添加到 azure Web 应用程序的应用程序证书的指纹。它是一个私有的 Azure 应用程序证书,并且已针对自定义域进行了验证。
我将此代码添加到我的 statup.cs configureservices 中(我知道硬编码这些值不是最佳实践,但我只想看看它是否可以加载证书,我将切换到环境变量和密钥保管库):
// 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);在启动.cs中配置服务 and 应用程序.UseIdentityServer()在启动.cs中配置:
未处理的异常。 System.InvalidOperationException:装饰器已注册类型:IAuthenticationService。
我不知道如何将证书添加到 app.UseIdentityServer();线。
EDIT 5
经过更多挖掘后,不幸的是@tnc1997 答案将不起作用。
在 asp.net core 3 中调用应用程序.UseIdentityServer in my 启动.cs内部尊重一个方法,该方法将在 appsetting(environment).json 文件中查找身份服务器 Key、File、Pass 等。
因此,即使我在 tnc1997 所示的代码中加载了证书,应用程序仍然会在设置文件中查找。因此设置文件必须包含 IS4 密钥的正确详细信息。
此外,azure 不会将证书放置在 Linux 容器中的典型受信任位置。根据我的阅读,执行此操作的唯一方法似乎是安装一个卷(在本例中为天蓝色存储文件共享)并使用上传到该文件共享的证书。
我可以确认这在本地有效,但现在我在运行容器、前端加载时仍然遇到问题,并且 Web api 项目似乎无法启动。我将发布另一个问题来解决该问题。