问题 running/configure 自托管控制台应用程序(ASP.net 核心 2.1,Kestrel)在 windows 网络服务器上具有 public 证书

Problems running/configure self hosted console application (ASP.net core 2.1, Kestrel) with public certificate on a windows webserver

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

  1. 在证书库中导入了一个public证书 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()

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

现在,我想对 asp.net 核心 2.1.6 应用程序执行相同的操作,但 它似乎无法以相同的方式工作。
Public 证书 (comodo) 安装在 windows 网络服务器的证书库中。
端口 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 的基本处理)。
我目前的发现:
错误消息中截断的“未指定服务器证书”表明,必须在应用程序中配置证书 ?

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

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

注意:在我的例子中,我必须将 5001 更改为 22224。

问题:

经过多次尝试和错误,我找到了适合我的相关信息。
注意:我现在使用 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" }
        }
      }
    }

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

internet 服务器上,我使用另一个 appsettings.json(对于带 http 的本地主机,对于带 https 和 certficate[=56 的服务器 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"
                }
            }
        }
    }
}

这样,应用程序可以直接在内网服务器上用http测试,在互联网上用https和cert测试。

处理:

  • 在服务器上,我有一个应用程序的根目录。
  • 直接在根目录下,我存储了"per machine"个不同文件的副本(包括appsettings.json)
  • 为了发布新版本,我在我的开发机器上发布,然后将 \publish\ 目录复制到服务器(在根目录下)并覆盖存储的文件。
  • 为了获得正确的配置,我创建了一个简单的 .cmd,它从我 运行 全新发布后...

https和证书注意事项:

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

而且...它有效...

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

  • 这个 Whosebug 问题:

  • This is a useful article 通过证书创建、在不同机器上信任它并配置 .Net 项目 (v2.0)。

我基本上做的是:

  • 将证书(在此示例中用于 localhost 开发)存储在证书文件夹中:
  • 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

    • 您无需编写任何设置代码,只需使用配置文件即可。

强制使用 HTTPS: app.UseHsts(); 在你的 Startup.cs

它似乎在没有 "AllowInvalid": "true" 的情况下也能正常工作,但我还不明白为什么。也许有人可以回答。

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

这里我没有用https,我用的是http。

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

我只解决了这个问题 运行 cmd 中的两个推荐

  1. 运行命令
  2. 输入好评dotnet dev-certs https --clean
  3. 最后输入命令dotnet dev-certs https -t
  4. 收到消息"The HTTPS developer certificate was generated successfully."
  5. 运行.net 核心项目