在 Windows 服务器上设置具有 TLS 证书的 .Net 7 微服务

Setup a .Net 7 microservice with a TLS certificate, on a windows server

提问人:bflow1 提问时间:7/20/2023 最后编辑:bflow1 更新时间:7/24/2023 访问量:286

问:

我有一个 .net 7 mini web api 作为 Windows 服务(没有 IIS)运行,它在本地运行没有问题。当我部署到生产服务器时,出现以下错误:

enter image description here

我完成了在服务器上创建和添加 localhost x.509 证书的过程:

enter image description here

我的问题是,如何将此证书附加到 api。配置 api 的后续步骤应该是什么,或者我需要添加什么代码。我只使用 IIS 找到了答案,这不是这个项目的一个选项。感谢您的帮助。

这是我的 Program.cs 代码片段:

var webApplicationOptions = new WebApplicationOptions
{
    Args = args,
    ContentRootPath = WindowsServiceHelpers.IsWindowsService()
        ? AppContext.BaseDirectory
        : default
};

var builder = WebApplication.CreateBuilder(webApplicationOptions);

builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
    var kestrelSection = context.Configuration.GetSection("Kestrel");
    serverOptions.Configure(kestrelSection);
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddCors();

builder.Services.AddHostedService<Worker>();

builder.Host
    .UseWindowsService()
    .UseSerilog((hostContext, logConfiguration) => logConfiguration.ReadFrom.Configuration(hostContext.Configuration))
    .ConfigureServices((hostContext, services) =>
    {
        
        services.AddWindowsService();
        services.AddHostedService<Worker>();
        services.AddMediatR(typeof(Program).Assembly);
        services.AddPersistenceServices(hostContext.Configuration);
        services.Configure<RabbitMqConfiguration>(config => hostContext.Configuration.GetSection(nameof(RabbitMqConfiguration)).Bind(config));
       
    });

var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
});

app.UseCors(p => p.WithOrigins("https://localhost:1234").AllowAnyHeader().AllowAnyMethod().AllowCredentials());

app.MapEndDebtorEndpoints();

app.Run();

下面是 appsettings.json 红隼设置。

"Kestrel": {
"Endpoints": {
  "Http": {
    "Url": "http://localhost:4321"
  },
  "Https": {
    "Url": "https://localhost:1234"
  }
}

},

C# Web 服务 SSL ASP.NET-WEB-API

评论

0赞 jdweng 7/20/2023
证书用于多个目的。它可以是用于 TLS 的证书,也可以是用于身份验证的证书。TLS用于在HTTP客户端和服务器之间建立加密连接。它是在发送 HTTP 请求之前执行的。在开始连接之前,必须在客户端和服务器上加载证书。TLS 证书不会通过连接发送。在服务器和客户端之间仅传输证书的名称。该名称作为 TLS 协议的一部分自动发送。
0赞 bflow1 7/20/2023
感谢您的输入。学习曲线。但是,当 api 部署到服务器时,如何让 api 发现证书。
0赞 jdweng 7/20/2023
TLS 服务器发送带有证书名称的证书块。客户端在存储中查找证书的名称。证书必须同时加载到客户端和服务器上。错误消息可能具有误导性。当 TLS 失败时,将发生超时异常。这可能意味着由于多种原因,连接未完成。客户端和服务器需要使用相同的端口号。代理可能无法正常工作,并阻止连接完成。IIS 服务器不支持 TLS 1.3(仅 1.2),因此 TLS 1.3 证书在 IIS 上不起作用。
0赞 bflow1 7/21/2023
好的,那么,启动中间件是否正确,或者我是否缺少一些代码来捕获证书。谢谢
0赞 jdweng 7/21/2023
如果这是问题所在,则需要将证书手动加载到客户端上。我怀疑它可能是代理。请参阅:learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/...

答: 暂无答案