我正在使用.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
但是,这些呼叫者无法呼叫被呼叫者,并且在以下情况下,我会收到不同类型的错误。
我尝试了很多事情:
dotnet开发人员证书https 显然,这允许api在docker-compose外部运行,并且可以在SSL上运行,并且在通讯中没有任何问题
生成并使用自签名证书 我使用了信息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测试)时,浏览器显示
我收到此异常:
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,但没有成功。
我能够在浏览器中找到各个API,并且可以手动运行它们。
当我禁用SSL时,他们可以进行交互而不会出现任何问题。
我花了几天的时间来尝试使它生效。非常感谢任何帮助或指示。
答案 0 :(得分:0)
我实际上遇到了相同的问题,看起来调用者容器不信任被调用容器的证书。您是否尝试过在调用方容器上运行以下命令?:
dotnet dev-certs https