Linux 容器上的 Kestrel 证书“没有这样的文件”适用于 Windows 容器

Posted

技术标签:

【中文标题】Linux 容器上的 Kestrel 证书“没有这样的文件”适用于 Windows 容器【英文标题】:Kestrel Certificate "no such file" on Linux containers works find on Windows containers 【发布时间】:2020-04-02 21:14:58 【问题描述】:

我已经在 docker windows 容器上使用 https 构建了一个 aspnetcore webapp,没有任何问题。当我修改它以使用 http 在 Linux 容器上运行时,没有问题。

但是,当我在 Linux 容器上启用 https 时,kestrel 会抛出一个异常,提示证书“未找到文件”。搜索后发现https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetcore-docker-https-development.md

Note: The certificate name, in this case aspnetapp.pfx must match the project assembly name.

我重命名了证书以匹配程序集名称的大小写。

假设名称是:

Company.RLG.Server.WebAPI.dll

我将证书文件命名为:“Company.RLG.Server.WebAPI.pfx”。出于我的测试应用程序的目的,我只是将其复制到 /https 文件夹。 (稍后将进行卷共享。)

我的 Kestrel 环境变量的 DockerFile 部分是:

ENV ASPNETCORE_HTTPS_PORT="8001"
ENV ASPNETCORE_Kestrel__Certificates__Default__Password="x"
ENV ASPNETCORE_Kestrel__Certificates__Default__Path="\https\Company.RLG.Server.WebAPI.pfx"
ENV ASPNETCORE_URLS="https://+;http://+"

然而,即使如此重命名,Kestrel 也抱怨:

crit: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
   at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
   at Internal.Cryptography.Pal.CertificatePal.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)

搜索并找到了许多与此问题相似但不完全不同的变体,但似乎都不适用于我的案例。

感谢您提出问题、建议和答案。

【问题讨论】:

顺便说一下,容器用户是这个测试应用的root用户,所以应该没有隐藏的权限问题 希望我能喜欢这个问题两次,因为它为我节省了大量时间! 【参考方案1】:

呃。

对不起各位愚蠢的问题。我发现了问题。

您在上面看到我在证书路径中添加了反斜杠。

我将它们更改为正斜杠,现在一切正常。

【讨论】:

每次我犯这个 Gumby 错误时,我都觉得我应该在头上戴一个打结的手帕,然后大喊“我的大脑受伤了!”特别是考虑到当我弄清楚时我通常会感到头疼。

以上是关于Linux 容器上的 Kestrel 证书“没有这样的文件”适用于 Windows 容器的主要内容,如果未能解决你的问题,请参考以下文章

为什么 Linux 上的 Asp.NET 5 需要 Kestrel ?

NGINX & Kestrel 502 响应(111:连接被拒绝)

如何强制 Visual Studio 为运行 Kestrel 的 .NET Core Web 应用程序重新创建 SSL 证书?

Asp Net vNext 上的 Kestrel 不提供 / 下的索引页面

在 Kestrel 上为 ASP.NET Core 上的两个不同端点发布两个不同的端点

启动 Kestrel 服务器时未使用 ApplicationManifest 中的 EndpointCertificate