首页 > 解决方案 > Docker CE for Windows - 无法建立 SSL 连接。根据验证程序,远程证书无效

问题描述

从容器化的 .net core 2.2 API调用内部 https url(如https://sample/demoapi/api/item/ )时遇到 SSL 问题。该 API 在容器外运行时可以正常工作。

注意:当将 ssl 文件夹从 Docker 瘦 Linux VM 挂载到容器时,容器可以完美运行。docker run -itd -p 5011:80 -v /etc/ssl/certs:/etc/ssl/certs

信息 Windows 版本:Win 10 Docker for windows CE 版本:Docker CE 2.0.0.3(不是最新的。从具有最新 docker CE 的容器调用 URL 时,我遇到 DNS 名称解析问题。Docker 2.0.0.3 是找到工作的那个没有问题)Docker 在 Windows 10 机器上运行,而不是在 VM 上。运行 Linux 主机和容器。我已按照以下解决方案将 ssl 证书复制并更新到容器上,但没有奏效。 Linux docker:System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效 如何在 docker 映像中添加 CA 根证书?

重现问题的步骤:

  1. 创建示例 .net core api 并调用 https 服务,如下所示。

    尝试 { var client = new HttpClient(); var resp = await client.GetAsync(" https://test.com "); 数据 = 等待 resp.Content.ReadAsStringAsync(); } catch(Exception e) { data = e.StackTrace + "- " + e.Message + " - " + e.InnerException; }

  2. 按上面指定发布应用应用类型:.net core 2.2 api 发布配置:目标框架:.netcoreapp2.2 部署方式:自包含目标运行时间:linux-x64

  3. 使用 docker 文件构建映像 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS 运行时 COPY Publish/ app/ COPY ./certf.crt /usr/local/share/ca-certificates/certf.crt RUN chmod 644 /usr/local/share/ca-certificates/certf.crt && update-ca-certificates ENTRYPOINT ["dotnet", "app/testapp1.dll"]

  4. 运行 docker 命令 - docker run -itd -p 5011:80 --name demoapi demoapi

  5. 浏览 url http://localhost:5011/api/vales/看看报错

FinishSendAsyncBuffered(Task1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at demoapiapp1.Controllers.ValuesController.Get(Int32 id) in C:\dev\Controllers\ItemsController.cs:line 41 ----- SSL 连接不能成立,见内部异常。<--------------------> System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效。在 System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken 消息,AsyncProtocolRequest asyncRequest,ExceptionDispatchInfo 异常)在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken 消息,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartSendBlob(字节[ ] 传入,Int32 计数,AsyncProtocolRequest asyncRequest) 在 System.Net.Security。

标签: dockerssl

解决方案


发现问题并解决。发布此内容以帮助遇到相同问题的任何人。

我使用了错误的证书。要使用的证书是证书颁发机构证书(根证书),但我使用的是颁发给系统的证书。我从链中生成了根证书,并使用上面提到的“stakoverlow”分辨率导入到容器中。

解决方法: ca 证书命名为 ca-cert.crt。在 Dockerfile 中添加了以下几行。

COPY ca-cert.crt /usr/local/share/ca-certificates/ca-cert.crt
RUN chmod 644 /usr/local/share/ca-certificates/ca-cert.crt && update-ca-certificates

推荐阅读