You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Docker中的C# Minimal API容器配置HTTPS访问

问题描述

我已将C#编写的Minimal API容器化,原本通过http://localhost:7113访问,现在希望启用https://localhost:7114(HTTPS协议)访问。

已完成的准备工作:

  • 生成自签名证书MinimalApi.pfx并放置在应用根目录,生成命令:
    $cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature -Subject "CN=MinimalApiRootCert" -KeyExportPolicy Exportable -HashAlgorithm sha256 -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign
    
  • appsettings.json已配置允许HTTP和HTTPS访问地址:
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "Urls": "http://*;https://*"
    }
    
  • Dockerfile已尝试将MinimalApi.pfx复制到容器内/etc/ssl/certs/目录:
    FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443
    
    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    ARG BUILD_CONFIGURATION=Release
    WORKDIR /src
    COPY ["MinimalApi/MinimalApi.csproj", "MinimalApi/"]
    RUN dotnet restore "MinimalApi/MinimalApi.csproj"
    COPY . .
    WORKDIR "/src/MinimalApi"
    COPY ["MinimalApi/MinimalApi.pfx", "/etc/ssl/certs/"]
    RUN dotnet build "MinimalApi.csproj" -c $BUILD_CONFIGURATION -o /app/build
    
    FROM build AS publish
    ARG BUILD_CONFIGURATION=Release
    RUN dotnet publish "./MinimalApi.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "MinimalApi.dll"]
    
  • docker-compose.yml配置了端口映射:
    networks:
      default:
        ipam:
          driver: default
    services:
      minimalapi-app:
        image: minimalapi-image
        ports:
          - '7113:7113'
          - '7114:7114'
        networks:
          - default
    volumes:
      minimalapi-app:
        driver: local
    

当前问题:Docker容器仅监听8080端口且仅支持HTTP协议,希望使用自签名证书启用HTTPS,偏好端口映射7114:7114或7114:443,不希望用Nginx反向代理,要本地运行的简单方案。


解决方案

要让容器内的Minimal API启用HTTPS,需要完成以下关键配置:

1. 配置Kestrel证书参数

ASP.NET Core的Kestrel服务器需要明确证书路径和密码才能启用HTTPS,修改appsettings.json添加相关配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Urls": "http://*:7113;https://*:7114", // 指定HTTP监听7113,HTTPS监听7114
  "Kestrel": {
    "Certificates": {
      "Default": {
        "Path": "/etc/ssl/certs/MinimalApi.pfx", // 容器内证书路径
        "Password": "你的PFX证书密码" // 导出证书时设置的密码,必填
      }
    }
  }
}

注意:导出PFX证书时必须设置密码,否则Kestrel无法加载证书。如果之前生成时未设置,需重新导出并设置密码。

2. 修正Dockerfile的证书复制逻辑

当前Dockerfile在build阶段复制证书,但final阶段基于base镜像,不会继承build阶段的文件。需要在final阶段从build阶段复制证书:
修改Dockerfile的final阶段:

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=build /etc/ssl/certs/MinimalApi.pfx /etc/ssl/certs/MinimalApi.pfx # 确保证书被复制到最终镜像
ENTRYPOINT ["dotnet", "MinimalApi.dll"]

或者更简单:在publish阶段将证书复制到输出目录,后续直接随应用文件一起复制到final镜像:
在build阶段的dotnet publish命令前添加:

COPY ["MinimalApi/MinimalApi.pfx", "/app/publish/"]

同时修改appsettings.json中的证书路径为./MinimalApi.pfx。

3. 调整端口映射(二选一)

方案A:7114:7114映射(容器内监听7114)

保持docker-compose.yml的端口配置不变:

services:
  minimalapi-app:
    image: minimalapi-image
    ports:
      - '7113:7113'
      - '7114:7114'
    networks:
      - default

方案B:7114:443映射(容器内监听443)

修改appsettings.json的Urls为http://*:7113;https://*:443,然后调整docker-compose.yml:

services:
  minimalapi-app:
    image: minimalapi-image
    ports:
      - '7113:7113'
      - '7114:443'
    networks:
      - default

4. 信任自签名证书(本地访问必备)

自签名证书会被浏览器标记为不安全,需在本地信任:

  • 双击MinimalApi.pfx,导入到本地计算机的受信任的根证书颁发机构目录。
  • 或用PowerShell命令导入:
    Import-Certificate -FilePath "MinimalApi.pfx" -CertStoreLocation "Cert:\LocalMachine\Root"
    

5. 验证配置

重新构建镜像并启动容器:

docker-compose build
docker-compose up

访问https://localhost:7114,确认HTTPS正常工作。


内容的提问来源于stack exchange,提问作者codingjoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:41:03