ma c проверка ошибки - исключение сертификации, в то время как docker -создание предотвращает запуск ASPNETCORE Docker -Container - PullRequest
0 голосов
/ 06 февраля 2020

Прежде всего, я не эксперт по linux и темам, связанным с сертификатами. Я пытаюсь закодировать веб-сервис и опубликовать sh как docker -контейнер.

Моя среда кодирования - это Visual Studio, работающая на Windows 10 в виртуальной машине. Здесь все работает.

Моя целевая среда - Ubuntu 18.04.4 LTS с Docker версия 19.03.6-rc1.

Поскольку я хочу иметь несколько сервисов в будущем , я пытаюсь использовать 'docker -compose up', который не работает, как указано.


Шаги, которые я делаю:

  1. Код в Windows VS 2017
  2. Publi sh on Docker .hub
  3. Попробуйте сочинить в Ubuntu

Подробнее ...

1. Код в Windows VS 2017

В режиме отладки у меня все работает.

У меня есть docker -композитный проект и проект API. docker -композитный проект включает в себя docker -compose.yml и файл переопределения.

Вот мой проект в VS: Проект в VS2017

docker -compose.yml

version: '3.4'

    services:
      logs.api:
        env_file: .env
        image: ${DOCKER_REGISTRY-}logsapi
        build:
          context: .
          dockerfile: logs.api/Dockerfile

docker -compose.override.yml

version: '3.4'

services:
  logs.api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44374
      - ConnectionString=${CONNECTION_STRING}
    ports:
      - "50530:80"
      - "44374:443"
    volumes:
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro

Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY logs.api/logs.api.csproj logs.api/
RUN dotnet restore logs.api/logs.api.csproj
COPY . .
WORKDIR /src/logs.api
RUN dotnet build logs.api.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish logs.api.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "logs.api.dll"]

3. Попробуйте создать в Ubuntu

Я пытаюсь создать в Ubuntu следующую команду и измененные файлы .yml. Прежде чем войти в docker концентратор с docker login.

Составить команду: sudo docker-compose -f docker-compose.yml -f docker-compose.production.yml up

docker -compose.yml

version: '3.4'

services:
  logs.api:
    env_file: .env
    image: autoempire/logsapi

docker -compose.production.yml

version: '3.4'

services:
  logs.api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44374
      - ConnectionString=${CONNECTION_STRING}
      - ASPNETCORE_Kestrel__Certificates__Default__Password=""
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/logs.api.pfx
    volumes:
      - ${HOME}/.aspnet/https:/https/
    ports:
      - "50530:80"
      - "44374:443"
    build:
      context: "http://${GIT_USR}:${GIT_PWD}@github.com/r...s/mymicroservices.git#master"
      dockerfile: logs.api/Dockerfile

Здесь вы видите, я уже изменил громкость. С секретами я не уверен, что делать, поэтому я удалил их, так как у меня нет пароля для сертификата. Но это может быть еще одна топика c.

Я добавил ASPNETCORE_Kestrel__Certificates__Default__Password и ASPNETCORE_Kestrel__Certificates__Default__Path в отношении некоторых полезных описаний в stackoverflow и создал самозаверяющий сертификат в Ubuntu, который я переместил на ~/.aspnet/https/logs.api.pfx.

Вот что я получаю:

logs.api_1  | info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
logs.api_1  |       User profile is available. Using '/root/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
logs.api_1  | crit: Microsoft.AspNetCore.Server.Kestrel[0]
logs.api_1  |       Unable to start Kestrel.
logs.api_1  | Interop+Crypto+OpenSslCryptographicException: error:23076071:PKCS12 routines:PKCS12_parse:mac verify failure
logs.api_1  |    at Internal.Cryptography.Pal.OpenSslPkcs12Reader.Decrypt(SafePasswordHandle password)
logs.api_1  |    at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs12(OpenSslPkcs12Reader pfx, SafePasswordHandle password, Boolean single, ICertificatePal& readPal, List`1& readCerts)
logs.api_1  |    at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs12(SafeBioHandle bio, SafePasswordHandle password, Boolean single, ICertificatePal& readPal, List`1& readCerts, Exception& openSslException)
logs.api_1  |    at Internal.Cryptography.Pal.CertificatePal.FromBio(SafeBioHandle bio, SafePasswordHandle password)
logs.api_1  |    at Internal.Cryptography.Pal.CertificatePal.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
logs.api_1  |    at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
logs.api_1  |    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert(ConfigurationReader configReader)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.ValidateOptions()
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
logs.api_1  |
logs.api_1  | Unhandled Exception: Interop+Crypto+OpenSslCryptographicException: error:23076071:PKCS12 routines:PKCS12_parse:mac verify failure
logs.api_1  |    at Internal.Cryptography.Pal.OpenSslPkcs12Reader.Decrypt(SafePasswordHandle password)
logs.api_1  |    at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs12(OpenSslPkcs12Reader pfx, SafePasswordHandle password, Boolean single, ICertificatePal& readPal, List`1& readCerts)
logs.api_1  |    at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs12(SafeBioHandle bio, SafePasswordHandle password, Boolean single, ICertificatePal& readPal, List`1& readCerts, Exception& openSslException)
logs.api_1  |    at Internal.Cryptography.Pal.CertificatePal.FromBio(SafeBioHandle bio, SafePasswordHandle password)
logs.api_1  |    at Internal.Cryptography.Pal.CertificatePal.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
logs.api_1  |    at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
logs.api_1  |    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert(ConfigurationReader configReader)
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.ValidateOptions()
logs.api_1  |    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
logs.api_1  |    at Microsoft.AspNetCore.Hosting.Internal.WebHost.StartAsync(CancellationToken cancellationToken)
logs.api_1  |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage)
logs.api_1  |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token)
logs.api_1  |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
logs.api_1  |    at logs.api.Program.Main(String[] args) in /src/logs.api/Program.cs:line 18
reco_logs.api_1 exited with code 139

Расположение сертификата в production.yml, кажется, в порядке, потому что когда я его изменяю, я получаю ошибку как "файл не найден". Я попробовал сертификат с и без пароля. Это не имеет значения ... может быть, не очень хорошо зарегистрирован?

...