如何使用自托管 ASP.NET Core 2 应用程序 (httpsys) 进行 HTTPS (SSL)
Posted
技术标签:
【中文标题】如何使用自托管 ASP.NET Core 2 应用程序 (httpsys) 进行 HTTPS (SSL)【英文标题】:How to HTTPS (SSL) with self-hosted ASP.NET Core 2 app (httpsys) 【发布时间】:2019-01-20 06:36:26 【问题描述】:我写了一个小的 ASP.NET Core 2 应用程序。它作为服务运行,因此没有 IIS。它在装有 Windows 7 SP1 的 PC 上运行。
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(pathToContentRoot)
.UseHttpSys(options =>
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://*:5050");
)
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
if (isService)
host.RunAsService();
else
host.Run();
如您所见,我想在端口 5050 上监听。没有 SSL 也可以正常工作。
我的问题是,如何为我的应用程序启用 https?再次:没有 IIS,没有域名(没有互联网连接)。通信只是在内部网络内部,所以我想使用自签名证书。
我阅读了文档 (HTTP.sys documentation;Netsh Commands;New-SelfSignedCertificate),但我的情况总是有所不同(他们使用 Krestel,或者是使用 IIS)。另外,我不知道如何为我的应用程序获取 App-ID(netsh 需要)。我试过这个:*** Get GUID 但它不起作用。
var assembly = typeof(Program).Assembly;
// following line produces: System.IndexOutOfRangeException
var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0];
var id = attribute.Value;
Console.WriteLine(id);
所以我对所有的可能性和不同的配置有点困惑。而且文档没有考虑我的具体情况。
我创建了一个证书,我想我需要将它存储在“我的”商店中。 (那在哪里?cert:\LocalMachine\My)然后我需要为其分配我的 Applicaion ID 和端口。
但我不知道该怎么做。有人可以帮忙吗?
【问题讨论】:
【参考方案1】:所以我通过以下方式解决问题:
首先,如果您想知道自己的 GUID,您将通过以下代码获得它:
var id = typeof(RuntimeEnvironment).GetTypeInfo().Assembly.GetCustomAttribute<GuidAttribute>().Value;
创建自签名证书
现在创建一个 SelfSigned-Certificate(如果您已经获得或购买了,请跳过此步骤)
-
运行以下 OpenSSL 命令以生成您的私钥和公共证书。回答问题并在出现提示时输入通用名称。
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
-
将您的密钥和证书组合到一个 PKCS#12 (P12) 捆绑包中:
openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12
在客户端安装证书:
对于 Windows 8 及更高版本:
使用 PowerShell
将证书添加到 Windows Cert StorePS C:> $certpwd = ConvertTo-SecureString -String "passwort" -Force –AsPlainText
PS C:> Import-PfxCertificate –FilePath D:\data\cert\certificate.p12 cert:\localMachine\my -Password $certpwd
获取证书的指纹(哈希)
PS C:\WINDOWS\system32> dir Cert:\LocalMachine\my
安装证书(用您的值替换哈希、IP 和端口)
PS C:\WINDOWS\system32> $guid = [guid]::NewGuid()
PS C:\WINDOWS\system32> $certHash = “A1D...B672E”
PS C:\WINDOWS\system32> $ip = "0.0.0.0"
PS C:\WINDOWS\system32> $port = "5050"
PS C:\WINDOWS\system32> "http 添加 sslcert ipport=$($ip):$port certash=$certHash appid=$guid" | netsh
你已经完成了。
适用于 Windows 7
将证书添加到 Windows 证书存储区(注意:此操作使用 .pem 文件,因为 certutil 似乎不支持 .p12 文件)
.\certutil.exe -addstore -enterprise -f "Root" C:\lwe\cert\certificate.pem
如果他的行抛出以下错误:
SSL 证书添加失败,错误 1312 指定的登录会话不存在。它可能已经被终止了。
您必须手动执行这些步骤(手动执行时请插入 .p12 文件,而不是 .pem):
运行 mmc.exe
转到文件-> 添加/删除管理单元
选择证书管理单元。
选择计算机帐户
导航到:证书(本地计算机)\个人\证书
右键单击证书文件夹并选择所有任务 -> 导入。
按照向导说明选择证书。确保在向导期间选中导出复选框。
要获取您证书的哈希值,请运行 Internet Explorer,按 Alt + X 并转到 Internet 选项 -> 内容 -> 证书。搜索您的证书并读取哈希值。
现在您可以运行与 Windows 8+ 相同的命令:
安装证书(用您的值替换哈希、IP 和端口)
PS C:\WINDOWS\system32> $guid = [guid]::NewGuid()
PS C:\WINDOWS\system32> $certHash = “A1D...B672E”
PS C:\WINDOWS\system32> $ip = "0.0.0.0"
PS C:\WINDOWS\system32> $port = "5050"
PS C:\WINDOWS\system32> "http 添加 sslcert ipport=$($ip):$port certash=$certHash appid=$guid" | netsh
编辑您的代码
毕竟,您必须将 UrlPrefixes 设置为 https。因此,在您的 Program.cs 文件中,您需要:
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(pathToContentRoot)
.UseHttpSys(options =>
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("https://*:5050");
)
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
【讨论】:
以上是关于如何使用自托管 ASP.NET Core 2 应用程序 (httpsys) 进行 HTTPS (SSL)的主要内容,如果未能解决你的问题,请参考以下文章