SSL问题-无法使用docker-compose连接到多个容器

时间:2019-05-03 13:00:01

标签: c# docker ssl docker-compose kestrel

我正在使用.Net core从Docker-Compose开始,并且在容器之间进行通信时遇到SSL握手问题。

堆栈 .Net Core 2.2, 适用于Windows的Docker CE(Linux容器)2.0.0.3, Docker Compose 3.4, VS2019更新2 Windows 10, Chrome版本74.0.3729.131(正式版本)(64位)

我有一个使用HttpClient的其他api调用的API。我已将它们添加到一个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开发人员证书https 显然,这允许api在docker-compose外部运行,并且可以在SSL上运行,并且在通讯中没有任何问题

  2. 生成并使用自签名证书 我使用了信息here并创建了证书。

它们已添加到Trusted根目录中。我可以在证书管理器中看到它们。
在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测试)时,浏览器显示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,但没有成功。

  1. 几种不同的方法,类似于上面的(2),但没有乐趣。

我能够在浏览器中找到各个API,并且可以手动运行它们。

当我禁用SSL时,他们可以进行交互而不会出现任何问题。

我花了几天的时间来尝试使它生效。非常感谢任何帮助或指示。

1 个答案:

答案 0 :(得分:0)

我实际上遇到了相同的问题,看起来调用者容器不信任被调用容器的证书。您是否尝试过在调用方容器上运行以下命令?:

dotnet dev-certs https