Проблема с SSL - невозможно подключиться к нескольким контейнерам с помощью docker-compose

Я начинаю работу с Docker-Compose с использованием ядра .Net и столкнулся с проблемой с подтверждением SSL при обмене данными между контейнерами.

Стек .Net Core 2.2, Docker CE для Windows (контейнеры Linux) 2.0.0.3, Docker Compose 3.4, VS2019 с обновлением 2, Windows 10, Chrome версии 74.0.3729.131 (официальная сборка) (64-разрядная версия)

У меня есть API, вызываемый другим API с помощью HttpClient. Я добавил их в один проект docker-compose, и на них ссылаются с использованием имен сервисов:

version: '3.4'

services:
  caller.api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:80
      - ASPNETCORE_HTTPS_PORT=44391
      - FirstServiceUrl=https://callee.api
    depends_on:
      - callee.api
    ports:
      - "44391:80"
    volumes:
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro

  callee.api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:80
      - ASPNETCORE_HTTPS_PORT=44392
    ports:
      - "44392:80"
    volumes:
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro


Однако этот вызывающий абонент не может вызвать вызываемого, и я получаю различные ошибки, основанные на следующих случаях.

Я пробовал несколько вещей:

  1. dotnet dev-certs https. Это, очевидно, позволяет запускать api за пределами docker-compose на SSL и не иметь никаких проблем со связью.

  2. Создание и использование самоподписанных сертификатов Я использовал информацию здесь и создал сертификаты.

Они добавляются в доверенный корень. Я вижу их в Cert Manager.
Добавлен следующий код в API Main:

var builder = WebHost.CreateDefaultBuilder(args);
builder.ConfigureAppConfiguration((ctx, cfg) => cfg.AddEnvironmentVariables());

builder.UseKestrel(options =>
{
     options.AddServerHeader = false;
     options.ListenAnyIP(80, o =>
     {
          o.UseHttps( new X509Certificate2( "callee.api.pfx", "password"));
     });
})
.UseStartup<Startup>();

Но когда я запускаю Chrome (для проверки с помощью swagger), браузер показывает  Ошибка незащищенности

Я получаю это исключение:

      Failed to authenticate HTTPS connection.
System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL. ---> Interop+Crypto+OpenSslCryptographicException: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown
   --- End of inner exception stack trace ---
   at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, Byte[] recvBuf, Int32 recvOffset, Int32 recvCount, Byte[]& sendBuf, Int32& sendCount)
   at System.Net.Security.SslStreamPal.HandshakeInternal(SafeFreeCredentials credential, SafeDeleteContext& context, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, SslAuthenticationOptions sslAuthenticationOptions)
   --- End of inner exception stack trace ---

Сначала я попытался создать сертификат как localhost.pfx, который не сработал. Я также пробовал использовать сертификат callee.pfx, но безуспешно.

  1. Несколько разных подходов, похожих на (2) выше, но без радости.

Я могу получить доступ к отдельным API в браузере и запустить их вручную.

Когда я отключаю SSL, они могут взаимодействовать без каких-либо проблем.

Я потратил пару дней, пытаясь заставить это работать. Был бы очень признателен за любую помощь или указатели.


person Ceemah Four    schedule 03.05.2019    source источник


Ответы (1)


На самом деле я столкнулся с той же проблемой, и похоже, что контейнер вызывающего абонента не доверяет сертификату вызываемого контейнера. Вы пробовали запустить в контейнере вызывающего абонента следующее ?:

dotnet dev-certs https
person Woland    schedule 02.04.2020