Ошибка «Объект не найден» при привязке Kestrel к порту https 443, работающему внутри docker

#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