Docker Image Certificate 信任問題

前言

繼上一篇做了 Kestrel Port 的大概說明後,後來又發生了一個狀況

因那個 App 會呼叫公司內部的 API 而公司內的API採用了 Https 引發了憑證不信任的問題

以下有兩種避免的作法

  1. HttpClient 注入 HttpClientHandler
services.AddHttpClient<JY_COG_FactoryWorkClient>().ConfigurePrimaryHttpMessageHandler(sp =>
    {
      return sp.GetRequiredService<SSLClientHandler>();
    });

public class SSLClientHandler : HttpClientHandler
{
  public SSLClientHandler()
  {
    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
  }
}
  1. 在 Docker Image 下新增信任憑證

目前看起來 Dotnet Core Image Kernel 是使用 Ubuntu 參考Ubuntu官網

$ sudo apt-get install -y ca-certificates #預設已經有了
$ sudocp local-ca.crt /usr/local/share/ca-certificates #複製自己的憑證進去
$ sudo update-ca-certificates # 系統更新憑證

而因為我偷懶不想要每次匯,因此就寫在 DockerFile 中

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore "./{ProjectName}.csproj"
RUN dotnet build "{ProjectName}.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "{ProjectName}.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish . #複製編譯完成結果
COPY root04.crt /usr/local/share/ca-certificates #複製憑證
RUN update-ca-certificates #更新憑證
ENTRYPOINT ["dotnet", "{ProjectName}.dll"]

只是因為剛好這個 Image 算好找憑證匯入方式,若是其他Linux版本更新就要找個版本的更新方式了