Kestrel - 在我的机器上使用特定的 SSL 证书
Kestrel - Use specific SSL cert already on my machine
Optimizely CMS(美工前身为EPiServer)最近发布了.Net Core版本。我可以使用 Kestrel 运行 我的网站。但是,我想为我的站点设置一个特定的 url,并且我想为此 url.
使用一个已经存在的 SSL 证书
证书安装在我的虚拟主机商店的机器上。
这是我的 Kestrel 配置:
launchSettings.json
"MySampleProject": {
"commandName": "Project",
"launchBrowser": true,
"externalUrlConfiguration": true,
"applicationUrl": "https://sampleproject.local.hostname.dev",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
appsettings.json
"Kestrel": {
"Endpoints": {
"HttpsInlineCertStore": {
"Url": "https://sampleproject.local.hostname.dev",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "WebHosting",
"Location": "LocalMachine",
"AllowInvalid": "true"
}
}
}
在program.cs
public static IHostBuilder CreateHostBuilder(string[] args, bool isDevelopment)
{
return Host.CreateDefaultBuilder(args)
.ConfigureCmsDefaults()
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions => serverOptions.AddServerHeader = false);
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
});
}
我假设配置有问题?但是我很难找到有关如何执行此操作的文档。
这是“一个”解决方案。我认为这不是最好的解决方案,但它确实有效。
这是我的 Kestrel 应用设置:
"Kestrel": {
"Endpoints": {
"HttpsInlineCertStore": {
"Url": "https://sampleproject.local.hostname.dev",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "webhosting",
"Location": "LocalMachine",
"AllowInvalid": "false"
}
}
}
}
然后在我的Program.cs
var storeName = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Store"];
var storeLocationString = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Location"];
var storeLocation = StoreLocation.LocalMachine;
if (storeLocationString == "CurrentUser")
{
storeLocation = StoreLocation.CurrentUser;
}
var subject = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Subject"];
var port = 8001;
services.Configure<KestrelServerOptions>(options =>
{
options.Listen(IPAddress.Any, port, listenOptions =>
{
// Enable support for HTTP1 and HTTP2 (required if you want to host gRPC endpoints)
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
// Configure Kestrel to use a certificate from a local .PFX file for hosting HTTPS
listenOptions.UseHttps(CertificateLoader.LoadFromStoreCert(subject, storeName, storeLocation, false), configureOptions: _ => { });
});
});
关键是我如何指向不在默认证书存储中的证书。我管理着多个站点,我的证书在该虚拟主机商店中。有一个带有商店名称的枚举,但虚拟主机不是该枚举的一部分。而且,我希望它在配置中,而不是代码中,因此不同的开发人员可以有不同的设置。
我想让它只使用应用程序设置中的内容,我只调用 UseKestral() 或其他东西并从配置中读取。但这至少有效。
宾果游戏。找到了所需的方法。
这是应用设置
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://sampleproject.local.hostname.dev:8001",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "webhosting",
"Location": "LocalMachine"
}
}
}
}
然后在Program.js
return Host.CreateDefaultBuilder(args)
.ConfigureCmsDefaults()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseStartup<Startup>();
});
Optimizely CMS(美工前身为EPiServer)最近发布了.Net Core版本。我可以使用 Kestrel 运行 我的网站。但是,我想为我的站点设置一个特定的 url,并且我想为此 url.
使用一个已经存在的 SSL 证书证书安装在我的虚拟主机商店的机器上。
这是我的 Kestrel 配置:
launchSettings.json
"MySampleProject": {
"commandName": "Project",
"launchBrowser": true,
"externalUrlConfiguration": true,
"applicationUrl": "https://sampleproject.local.hostname.dev",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
appsettings.json
"Kestrel": {
"Endpoints": {
"HttpsInlineCertStore": {
"Url": "https://sampleproject.local.hostname.dev",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "WebHosting",
"Location": "LocalMachine",
"AllowInvalid": "true"
}
}
}
在program.cs
public static IHostBuilder CreateHostBuilder(string[] args, bool isDevelopment)
{
return Host.CreateDefaultBuilder(args)
.ConfigureCmsDefaults()
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions => serverOptions.AddServerHeader = false);
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
});
}
我假设配置有问题?但是我很难找到有关如何执行此操作的文档。
这是“一个”解决方案。我认为这不是最好的解决方案,但它确实有效。
这是我的 Kestrel 应用设置:
"Kestrel": {
"Endpoints": {
"HttpsInlineCertStore": {
"Url": "https://sampleproject.local.hostname.dev",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "webhosting",
"Location": "LocalMachine",
"AllowInvalid": "false"
}
}
}
}
然后在我的Program.cs
var storeName = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Store"];
var storeLocationString = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Location"];
var storeLocation = StoreLocation.LocalMachine;
if (storeLocationString == "CurrentUser")
{
storeLocation = StoreLocation.CurrentUser;
}
var subject = context.Configuration["Kestrel:Endpoints:HttpsInlineCertStore:Certificate:Subject"];
var port = 8001;
services.Configure<KestrelServerOptions>(options =>
{
options.Listen(IPAddress.Any, port, listenOptions =>
{
// Enable support for HTTP1 and HTTP2 (required if you want to host gRPC endpoints)
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
// Configure Kestrel to use a certificate from a local .PFX file for hosting HTTPS
listenOptions.UseHttps(CertificateLoader.LoadFromStoreCert(subject, storeName, storeLocation, false), configureOptions: _ => { });
});
});
关键是我如何指向不在默认证书存储中的证书。我管理着多个站点,我的证书在该虚拟主机商店中。有一个带有商店名称的枚举,但虚拟主机不是该枚举的一部分。而且,我希望它在配置中,而不是代码中,因此不同的开发人员可以有不同的设置。
我想让它只使用应用程序设置中的内容,我只调用 UseKestral() 或其他东西并从配置中读取。但这至少有效。
宾果游戏。找到了所需的方法。
这是应用设置
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://sampleproject.local.hostname.dev:8001",
"Certificate": {
"Subject": "local.hostname.dev",
"Store": "webhosting",
"Location": "LocalMachine"
}
}
}
}
然后在Program.js
return Host.CreateDefaultBuilder(args)
.ConfigureCmsDefaults()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseStartup<Startup>();
});