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

5

我以前使用 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 并应用到 (vb.net) HttpSelfHostConfiguration() 中。例如:https://IP:Port

这样可以顺利工作,我能够按照需要配置应用程序(例如,在内部网络服务器上为 http 配置一个端口以进行测试,在生产环境中为 https 配置另一个端口)。

现在,我想使用 ASP.NET Core 2.1.6 应用程序做同样的事情,但似乎不能以同样的方式工作。
公共证书(Comodo)已安装在 Windows Web 服务器的证书存储中。
使用 netsh 配置了 https 端口 22224。
已经使用 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),则应用程序可以正常运行(通过互联网)。
如果我设置已配置的https端口(https://IP:22224),则应用程序无法启动并显示错误信息:
无法配置HTTPS端点。未指定服务器证书,且找不到默认开发人员证书。

我在网上找到的信息令人困惑,这似乎是一个“移动目标”主题(asp.net core 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 core 2.1应用程序中配置(已绑定到端口的)公共证书吗?

  • 如果是这样,最好的方法是什么(上面的示例是否是一个好方法)?

4个回答

9

经过多次尝试和错误,我已找到适合我的相关信息。
注意:我现在使用的是ASP.net core 2.1.6版本(如果您使用的是旧版本,则可能不适用...)

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

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

在企业内部网络服务器上,我使用另一个带有http的appsettings.json文件:
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
,
    "Kestrel": {
      "EndPoints": {
        "Http1": { "Url": "http://localhost:5000" },
        "Http2": { "Url": "http://172.16.1.120:22222" }
        }
      }
    }

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

对于 互联网 服务器,我使用另一个 appsettings.json 文件(用于 localhost 的 http,用于服务器 IP 的 https 和证书):

{
  "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和证书进行测试。
处理:
- 在服务器上,我有一个应用程序的根目录。 - 直接在根目录下,我存储了“每台机器”不同文件(包括appsettings.json)的副本。 - 要发布新版本,我在开发机器上发布,然后将\publish\目录复制到服务器(在根目录下),并覆盖存储的文件。 - 为了拥有正确的配置,我创建了一个简单的.cmd,它会从根目录中复制(特定于服务器的)配置文件到子目录\publish\,在新发布之后运行...
关于https和证书的注意事项:
- 证书必须存储在\publish\文件夹中。 - 由于(我的)公共contoso证书确保了一些域,因此仅当通过域调用应用程序时,https才能正常工作(否则,会显示“不安全”的消息)。 - 为了能够使用https测试应用程序,我已经在Windows防火墙和“真实”防火墙上打开了22224端口。 - DNS指向我们互联网服务器的公共IP。 - 进行测试时,我使用https://www.Domain.xx:22224来调用应用程序。
而且...它能正常工作...

好的建议:“证书必须存储在\publish\文件夹中。” - Andrei

6
我正在使用Docker化部署我的ASP.Net Core应用程序v2.2,并使用以下指南使其正常工作(自2017年1月的v2.1起,应该可以正常工作):

我基本上所做的就是:

  • 将证书(在本例中为localhost开发)存储在certificates文件夹中: 输入图像描述
  • 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: 在您的 Startup.cs 中添加 app.UseHsts();

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


1
这篇文章相比,我们似乎有选择,在配置中完成或使用中间件管道构建器。 - Chaim Eliyah

1
我通过在cmd中运行两个命令解决了这个问题:
  1. 打开cmd
  2. 输入命令dotnet dev-certs https --clean
  3. 最后输入命令dotnet dev-certs https -t
  4. 收到消息“HTTPS开发人员证书已成功生成。”
  5. 运行 .net core 项目

-3

我在开发环境中使用以下的appsettings.json文件。

这里我没有使用https,而是使用了http。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接