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