由于证书链中的错误,远程证书无效:UntrustedRoot with SendGrid in Docker

Posted

技术标签:

【中文标题】由于证书链中的错误,远程证书无效:UntrustedRoot with SendGrid in Docker【英文标题】:The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot with SendGrid in Docker 【发布时间】:2022-01-12 12:35:38 【问题描述】:

我正在使用 SendGrid 发送电子邮件 .net5 windows 服务,当我从 Visual Studio 本地运行应用程序时,它按预期工作。但是当我在 Docker 中运行应用程序时,SendEmailAsync 会出现异常。

例外:

由于证书错误,远程证书无效 链:UntrustedRoot

List<Personalization> personalizations = new List<Personalization>();
Personalization personalization = new Personalization();

personalization.From = new EmailAddress(emailDetails.SenderMailID);
personalization.Tos = GetRecipientsList(emailDetails.RecipientMailID);
personalization.Subject = emailDetails.Subject;
personalizations.Add(personalization);
var msg = new SendGridMessage

    From = new EmailAddress(emailDetails.SenderMailID),
    Subject = emailDetails.Subject
;
msg.AddContent(MimeType.html, emailDetails.Message);
msg.Personalizations = personalizations;
var sendGridClient = new SendGridClient(apiKey);
var sendGridResponse = await sendGridClient.SendEmailAsync(msg);

Docker 文件:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["src/service/MyWindowsService/MyWindowsService.csproj", "src/service/MyWindowsService/"]
RUN dotnet restore "src/service/MyWindowsService/MyWindowsService.csproj"
COPY . .
WORKDIR "/src/src/service/MyWindowsService"
RUN dotnet build "MyWindowsService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyWindowsService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWindowsService.dll"]

【问题讨论】:

【参考方案1】:

这里的问题似乎是一个不受信任的证书。例如,当证书是自签名的或使用非公共 CA 根时,可能会发生这种情况。

在这种情况下,我要做的是将证书或 CA 复制到您的基本/最终 docker 阶段的路径“/etc/ssl/certs/”。

例如在你的 docker 文件的第二行:

复制./server-certificate.pem /etc/ssl/certs/server-certificate.pem

如果这是您的问题,前面的方法会告诉您。假设这是解决方案,我建议您不要直接复制 docker 文件中的证书。例如,在生产环境中,如果您使用 Kubernetes 或使用 docker-compose 和卷,您应该将其作为 Secret 来执行。

编辑: 获取您需要信任的证书并将其放在 Dockerfile 的同一路径上。 然后像下面这样编辑你的 dockerfile:

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
COPY ./server-certificate.pem /etc/ssl/certs/server-certificate.pem
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["src/service/MyWindowsService/MyWindowsService.csproj", "src/service/MyWindowsService/"]
RUN dotnet restore "src/service/MyWindowsService/MyWindowsService.csproj"
COPY . .
WORKDIR "/src/src/service/MyWindowsService"
RUN dotnet build "MyWindowsService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyWindowsService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWindowsService.dll"]

【讨论】:

我在 DockerFile 中添加了 COPY ./server-certificate.pem /etc/ssl/certs/server-certificate.pem 行,但在 RUN dotnet build "FXPayments.Service.FxCloudEmailService.csproj" -c Release -o /app/build 行中添加了行,但它给出了相同的异常。我还需要做什么吗? 如果 COPY 命令运行良好,您的 docker 容器应该能够信任您添加到路径 /etc/ssl/certs 的证书或 CA。我建议您检查您的容器是否可以与您的应用程序尝试连接的服务器建立安全连接。可以从正在运行的 docker 容器中考虑 bash 和/或验证您复制的证书是否在预期路径上。 我的证书名称是什么?我也找不到路径 /etc/ssl/certs 上的文件 将与您在 COPY 命令中命名的相同(例如 server-certificate.pem)。在命令示例中,您需要从要连接的服务器获得与 Dockerfile 相同级别的正确证书。根据需要替换名称 server-certificate.pem。 抱歉,我没有收到此评论 在命令示例中,您需要从要连接的服务器获得与 Dockerfile 相同级别的正确证书 .

以上是关于由于证书链中的错误,远程证书无效:UntrustedRoot with SendGrid in Docker的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 登录错误:证书链中的自签名证书

Ionic Cordova 资源错误:证书链中的自签名证书

Openssl:错误“证书链中的自签名证书”

Openssl:错误“证书链中的自签名证书”

nodejs - 证书链中的错误自签名证书

Curl 错误 60,SSL 证书问题:证书链中的自签名证书