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>();
                });