我以前开发过各种web服务(VB ASP.net web-api应用程序),用https进行生产。我已经使用http完成了开发,然后在生产服务器上设置了https。要在生产服务器上为https和证书设置端口,我有:
netsh http add urlacl url = https://+:22224/ user = everyone
netsh http add sslcert ipport = 0.0.0.0:22224 certhash = 31cf73308a768100d4d32fe6e77638593e68ab57 appid = {a33a711f-c587-44e5-96bc-dca8a7f3fc3c}
这没有问题,我可以根据需要配置应用程序(例如,在配置文件中配置一个端口,用于在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核心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进行测试。
处理:
https和证书说明:
并且...它的工作原理......
我正在为我的ASP.Net Core App v2.2使用Dockerized部署,并使用以下指南使其工作(此should work as of v2.1, Jan. 2017):
我基本上做的是:
"Kestrel": {
"applicationUrl": "https://localhost:5051;http://localhost:5050",
"Certificates": {
"Default": {
"Path": "certificates/localhost.pfx",
"Password": "MySecret",
"AllowInvalid": "true"
}
}
}
"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"
工作,但我不明白为什么。也许有人可以回答。
对于开发环境,我使用下面的appsettings.json
这里我不使用https,我使用http。
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndPoints": {
"http": { "Url": "http://localhost:5000" }
}
}
}