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

Я начинаю на 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 (для проверки с помощью сваггера), браузер показывает Not Secure Error

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

      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, но безуспешно.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...