#docker #asp.net-core #.net-core #https #kestrel-http-server
Вопрос:
У меня есть приложение dotnet core, которое должно запускаться в контейнере Windows core и предоставлять порт 443 (https)
Я передал сертификат в контейнер, настроил переменные среды для пути пользователя и пароля. Приложение может найти сертификат de, но завершается ошибкой со следующей ошибкой:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
Internal.Cryptography.CryptoThrowHelper WindowsCryptographicException: Object was not found.
Сертификат является сертификатом с подписью seft для домена localhost.
Я пытаюсь добавить локальный хост сервера в контейнер docker, но также не получилось.
Это не проблема с паролем сертификата или местоположением сертификата, поскольку эти проблемы приводят к явным ошибкам.
Здесь докер соответствующие файлы конфигурации:
Докерфайл:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 443
VOLUME c:/certificates
COPY . .
#place to put the https certificate
ENV ASPNETCORE_URLS="https:// :443"
ENV ASPNETCORE_HTTPS_PORT=8243
ENTRYPOINT ["dotnet", "webApp.dll"]
Докер-сочиняй.файл yaml:
version: '3.4'
services:
webApp:
container_name: webApp
build:
context: ..webApp
dockerfile: Dockerfile
volumes:
- type: bind
source: d:/certificates
target: c:/certificates
environment:
- ASPNETCORE_Kestrel__Certificates__Default__Password=somepass
- ASPNETCORE_Kestrel__Certificates__Default__Path=c:certificatesservercert.pfx
ports:
- "8243:443"
extra_hosts:
- "localhost:127.0.0.1"
networks:
- net
networks:
net:
Как запустить:
docker-compose run wepApp
Полный стек ошибок:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
Internal.Cryptography.CryptoThrowHelper WindowsCryptographicException: Object was not found.
at Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(ReadOnlySpan`1 rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(ReadOnlySpan`1 rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Certificates.CertificateConfigLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
Unhandled exception. Internal.Cryptography.CryptoThrowHelper WindowsCryptographicException: Object was not found.
at Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(ReadOnlySpan`1 rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(ReadOnlySpan`1 rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Certificates.CertificateConfigLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
at Backoffice.Program.Main(String[] args) in D:a1sBackOfficeProgram.cs:line 12
Я должен упустить что-то основное, как только проблема заключается в запуске ядра DotNet в контейнере Windows с использованием https. Ничего необычного.
Ответ №1:
Решается путем запуска контейнера с пользователем ContainerAdministrator
Проблема не всегда проявляется, она выглядит связанной с используемым изображением. Для получения дополнительной информации об этой проблеме проверьте github
Чтобы настроить пользователя на docker-составьте.добавить файл yaml:
services:
wepApp:
user: "ContainerAdministrator"
Для установки из командной строки:
> docker-compose run --user ContainerAdministrator wepApp