Я начинаю работу с 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
Однако этот вызывающий абонент не может вызвать вызываемого, и я получаю различные ошибки, основанные на следующих случаях.
Я пробовал несколько вещей:
dotnet dev-certs https. Это, очевидно, позволяет запускать api за пределами docker-compose на SSL и не иметь никаких проблем со связью.
Создание и использование самоподписанных сертификатов Я использовал информацию здесь и создал сертификаты.
Они добавляются в доверенный корень. Я вижу их в 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, но безуспешно.
- Несколько разных подходов, похожих на (2) выше, но без радости.
Я могу получить доступ к отдельным API в браузере и запустить их вручную.
Когда я отключаю SSL, они могут взаимодействовать без каких-либо проблем.
Я потратил пару дней, пытаясь заставить это работать. Был бы очень признателен за любую помощь или указатели.