运行/配置自托管控制台应用程序(ASP.net核心2.1,Kestrel)与Windows Web服务器上的公共证书的问题

问题描述 投票:2回答:3

我以前开发过各种web服务(VB ASP.net web-api应用程序),用https进行生产。我已经使用http完成了开发,然后在生产服务器上设置了https。要在生产服务器上为https和证书设置端口,我有:

  1. 在Windows服务器上的证书存储区中导入公共证书,为netsh配置了https的特定端口。例如:

netsh http add urlacl url = https://+:22224/ user = everyone

  1. 将证书(通过指纹)绑定到端口。例如:

netsh http add sslcert ipport = 0.0.0.0:22224 certhash = 31cf73308a768100d4d32fe6e77638593e68ab57 appid = {a33a711f-c587-44e5-96bc-dca8a7f3fc3c}

  1. 设置应用程序以侦听特定端口,从而在启动时从配置文件中读取URL - 例如https://IP:Port并将其应用于(vb.net)HttpSelfHostConfiguration()

这没有问题,我可以根据需要配置应用程序(例如,在配置文件中配置一个端口,用于在Intranet服务器上进行测试,在配置文件中为https配置生产环境中的另一个端口)。

现在,我想对asp.net核心2.1.6应用程序做同样的事情,它似乎不会以相同的方式工作。 公共证书(comodo)安装在Windows Web服务器的证书存储中。 端口22224配置有用于https的netsh。 证书使用netsh绑定到端口(证书显示正确,netsh http show sslcert ipport = 0.0.0.0:22224 在Program.cs中,我添加了使用UseUrls监听的端口:

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>() //;
            .UseUrls(GV.cURL, "http://localhost:5000"); 
    }

GV.curl在运行时包含https://IP:22224

如果我将它配置为http端口(例如http://IP:22222),应用程序运行正常(通过Internet)。 如果我设置(已配置)https端口(https://IP:22224),应用程序不会启动并给出错误消息: 无法配置HTTPS端点。未指定服务器证书,并且找不到默认的开发人员证书。

我在网上发现的信息令人困惑,似乎这个主题是一个“移动目标”(通常在asp.net核心x-x的基本处理方面有所改变)。 我现在的发现: 错误消息中的剪切“未指定服务器证书”表示必须在应用程序中配置证书?

我找到了一个使用.useKestrel选项在CreateWebHostBuilder中指定证书的示例:

.UseKestrel(options =>
        {
            options.Listen(IPAddress.Loopback, 5000);
            options.Listen(IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("certificate.pfx", "topsecret");
            });

注意:在我的情况下,我将不得不将5001更改为22224。

问题:

  • 我是否真的必须在asp.net core 2.1应用程序中配置(已经到端口绑定)公共证书?
  • 如果是,那么最好的方法是什么(上面的例子是一个好方法)?
https asp.net-core-mvc certificate asp.net-core-2.1 kestrel-http-server
3个回答
4
投票

经过大量的尝试和错误,我找到了适合我的相关信息。 注意:我现在使用ASP.net核心2.1.6(如果您使用旧版本,这可能对您不起作用...

您不需要使用netsh进行任何配置,但您必须配置证书(包括密码)。 你还不需要改变program.cs ...... 配置可以在appsettings.json中完成(包含在项目根目录中) 所以...在项目中(在我的机器上调试),我使用默认的appsettings.json(使用http):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

在Intranet服务器上,我使用另一个appsettings.json(仍然使用http):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
,
    "Kestrel": {
      "EndPoints": {
        "Http1": { "Url": "http://localhost:5000" },
        "Http2": { "Url": "http://172.16.1.120:22222" }
        }
      }
    }

这样,应用程序可以在局域网中通过Intranet服务器的IP地址进行测试,也可以直接在Intranet服务器(localhost端口5000)上进行测试。

在互联网服务器上,我使用另一个appsettings.json(对于带有http的localhost,对于带有https和certficate的服务器IP):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
,
    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://localhost:5000"
            },
            "HttpsInlineCertFile": {
                "Url": "https://192.168.3.3:22224",
                "Certificate": {
                    "Path": "./certificate.pfx",
                    "Password": "NotReally",
                    "AllowInvalid": "true"
                }
            }
        }
    }
}

这样,应用程序可以直接在Intranet服务器上使用http进行测试,也可以通过Internet使用https和cert进行测试。

处理:

  • 在服务器上,我有一个应用程序的根目录。
  • 直接在root下,我已经存储了“每台机器”不同文件的副本(包括appsettings.json)
  • 要发布新版本,我将在我的开发计算机上发布,然后将\ publish \目录复制到服务器(在根目录下)并覆盖存储的文件。
  • 为了获得正确的配置,我创建了一个简单的.cmd,它复制了我在新发布后运行的子目录\ publish \中的根(特定于服务器)配置文件...

https和证书说明:

  • 证书必须存储在\ publish \文件夹中。
  • 由于(我的)公共contoso证书确实保护了一些域,因此如果通过域调用应用程序,https只能正常工作(否则,显示好的“不安全”消息)。
  • 为了能够使用https测试应用程序,我在Windows上打开了端口22224和“真正的”防火墙。
  • DNS指向我们的Internet服务器的公共IP。 为了测试,我用https://www.Domain.xx:22224调用应用程序

并且...它的工作原理......


2
投票

我正在为我的ASP.Net Core App v2.2使用Dockerized部署,并使用以下指南使其工作(此should work as of v2.1, Jan. 2017):

我基本上做的是:

  • 将证书(在本示例中为localhost开发)存储在证书文件夹中:enter image description here
  • appsettings.json:
    "Kestrel": {
      "applicationUrl": "https://localhost:5051;http://localhost:5050",
      "Certificates": {
        "Default": {
          "Path": "certificates/localhost.pfx",
          "Password": "MySecret",
          "AllowInvalid": "true"
        }
      }
    }
  • 设置应用程序URL 通过launchsettings.json(仅限本地开发)
    "kamapp-backend": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5051;http://localhost:5050",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
  • 通过环境ASPNETCORE_URLS="http://+:5050;https://+:5051",例如。 ASPNETCORE_URLS="http://+:5050;https://+:5051" dotnet run 您不必编码任何设置,只需使用配置文件。

在您的Startup.cs中强制HTTPS:app.UseHsts();

它似乎没有"AllowInvalid": "true"工作,但我不明白为什么。也许有人可以回答。


0
投票

对于开发环境,我使用下面的appsettings.json

这里我不使用https,我使用http。

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndPoints": {
      "http": { "Url": "http://localhost:5000" }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.