【问题标题】:Unable to configure ASP.NET HTTPS endpoint in Windows docker container无法在 Windows docker 容器中配置 ASP.NET HTTPS 端点
【发布时间】:2019-02-26 16:15:29
【问题描述】:

在 Windows docker 容器中运行 ASP.NET Core 时出现此错误...

Unhandled Exception: System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found.

我能够让它工作......

RUN dotnet dev-certs https

但我想安装一个实际的证书...现在是自签名证书,但后来是真实的。

因此,根据题为“使用 Powershell 在 Windows 容器中导入和绑定 SSL 证书”的博文,我创建了以下 PS 脚本以在容器构建中运行...

Import-PfxCertificate -FilePath C:\Certificates\xxx.pfx -Password (ConvertTo-SecureString -String "xxxx" -AsPlainText -Force) `
-CertStoreLocation "Cert:\LocalMachine\My"

$cert = (Get-ChildItem -Path cert:\LocalMachine\My -DNSName "xxx.mydomain.com")[0]

$thumb =  ($cert | Select-Object Thumbprint)."Thumbprint"
$guid = [guid]::NewGuid().ToString("B")

netsh http add sslcert ipport=0.0.0.0:5001 certhash=$thumb certstorename=MY appid="$guid"

这构建良好,似乎安装了证书。但是当我尝试运行容器时出现异常。我尝试使用 443 而不是 5001,同样的错误

这是我的 docker 文件供参考...

 escape=`
 FROM xxx/base
 EXPOSE 5000
 EXPOSE 5001
 COPY testing/ /testing
 COPY service/ /Service
 COPY certificates/ /certificates
 COPY scripts/ /scripts

 # install certificates

 RUN scripts/Install-Container-Certificate.ps1

 # configure ASP.NET Core

 ENV ASPNETCORE_URLS http://+:80;https://+:443
 EXPOSE 80
 EXPOSE 443
 # RUN dotnet dev-certs https
 # start ASP.NET Core

 ENTRYPOINT ["dotnet","/Service/xxxService.dll"]

我做错了什么?

【问题讨论】:

标签: powershell docker asp.net-core


【解决方案1】:

如果您想使用自签名证书在开发中运行,您可以关注here 文章。对于生产场景而不是here

简而言之,建议的方法与您使用的方法不同,因为可以安装两个卷,引用包含您的证书和您的 dotnet 机密的文件夹。

您可以将您的主机“%USER%\.aspnet\https”文件夹映射到您的访客“/root/.aspnet/https/”,并将您的主机“%APPDATA%\microsoft\UserSecrets\”文件夹映射到您的访客“ /root/.microsoft/usersecrets”。

生产和开发之间的主要区别在于,在生产中您不会使用机密,您需要传递包含您的证书和密码的文件夹才能使用环境变量访问它:

  • ASPNETCORE_Kestrel__Certificates__Default__Path
  • ASPNETCORE_Kestrel__Certificates__Default__Password

Kestrel 将在“/root/.aspnet/https/”文件夹中的 Linux 客户机上查找与您的项目同名的证书。

如果我使用您的 appsettings.Development.json 启用跟踪:

“记录”:{ “日志级别”:{ “默认”:“跟踪”, “系统”:“跟踪”, “微软”:“追踪” } }

如果我开始运行示例应用程序时未在来宾容器中安装证书,则会看到以下错误:

root@7afc71f877ce:/app# dotnet helloworld.dll dbug:Microsoft.Extensions.Hosting.Internal.Host[1] 托管开始 错误:Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer[2] 未能在“/root/.aspnet/https/helloworld.pfx”中找到开发 https 证书。 dbug:Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer[1] 找不到合适的开发 https 证书。 暴击:Microsoft.AspNetCore.Server.Kestrel[0] 无法启动 Kestrel。 System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发人员证书找不到或已过期。 要生成开发人员证书,请运行“dotnet dev-certs https”。要信任证书(仅限 Windows 和 macOS),请运行“dotnet dev-certs https --trust”。

希望对你有帮助。

【讨论】:

  • 好的,谢谢。但是无法使生产方案正常工作。文档似乎不正确。当我在 Windows 容器的 Windows 部分中使用 docker run 命令时,我收到错误“来自守护进程的错误响应:无效的卷规范”。
  • 好的,我尝试在本地重现它,我可以通过设置主机或来宾上不存在的路径来触发该错误。我有一个相对较新的 Docker 版本,这些是我的错误:“来自守护进程的错误响应:.aspnet\https%!(EXTRA 字符串=不是有效的 Windows 路径)。”或“来自守护进程的错误响应:无效卷规范:'/host_mnt/c/Users/Alberto/.aspnet/https:.aspnet/https/':类型“bind”的无效装载配置:无效装载路径:'.aspnet/ https/' 挂载路径必须是绝对路径。”。
  • 如果你使用 PowerShell %USERPROFILE% 会变成 $Env:USERPROFILE?
  • 不使用 cmd。必须在 Windows 上修改卷安装语法。 -v somepath:c:\somepath 绝对不起作用。前段时间我打过这个。这在码头工人方面的记录非常差。显然,编写文档的人从未尝试过该命令。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2020-07-28
  • 2019-04-28
  • 1970-01-01
  • 2022-01-13
  • 2018-06-21
相关资源
最近更新 更多