云 运行 REST 外部请求期间的 SSL 错误 API - DOCKER

SSL error during cloud run external request on REST API - DOCKER

我在使用 .NET 6 开发的云 运行 上有一个 API。API 运行良好,大多数路由都按预期运行。

在我的 API 上,我有一些路由需要检查发出 REST 请求的外部服务(主要是 POST 调用)。

问题是:当我将我的 API 带到云端 运行 时,这些路线无法正常工作。我在请求期间收到 SSL 错误。

在我的电脑、同事的电脑(不同的 ISP)和 GCP VM 上,API 按预期工作。

问题只发生在云端运行。

{
  "success": false,
  "metaData": null,
  "dataHora": "2022-04-25T17:09:16.683683+00:00",
  "errorMetaData": {
    "stackTrace": null,
    "errorMessage": "Call failed. The SSL connection could not be established, see inner exception: POST https://************************/b1s/v1/Login",
    "innerError": {
      "stackTrace": null,
      "errorMessage": "The SSL connection could not be established, see inner exception.",
      "innerError": {
        "stackTrace": null,
        "errorMessage": "Authentication failed, see inner exception.",
        "innerError": {
          "stackTrace": null,
          "errorMessage": "SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.",
          "innerError": {
            "stackTrace": null,
            "errorMessage": "error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol",
            "innerError": null
          }
        }
      }
    }
  }
}

编辑:

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/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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

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

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

我认为 TLS 兼容性也是一个问题,因为我尝试访问的 API 有一个旧的 TLS 版本。

在我的本地计算机上使用 docker 尝试并收到相同的错误 - 所以这不是云 运行 问题,但可能是 docker 中的某种配置?

我通过在 ENTRYPOINT 之前使用以下代码将 TLS 的最低版本更改为 1.0 来解决问题。

RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/' /etc/ssl/openssl.cnf \
&& sed -i 's/CipherString = DEFAULT@SECLEVEL=2/CipherString = DEFAULT@SECLEVEL=1/' /etc/ssl/openssl.cnf