using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using Vit.Core.Util.Common;
using Vit.WebHost.Extensions.UseCertificates;
namespace Vit.Extensions
{
public static partial class IServiceCollectionExtensions_UseCertificates
{
///
/// 加载https证书
///
///
/// //appsettings.json
/// //...
/// "server": {
/// /* https证书配置,可不指定。若urls中指定了https协议,请在此指定对应的https证书 */
/// "certificates": [
/// {
/// "filePath": "data/serset-com-iis-0923120142.pfx",
/// "password": "password"
/// }
/// ]
/// },
/// //...
///
///
///
///
///
/// 在appsettings.json文件中的路径。默认:"server.certificates"。
///
public static IServiceCollection UseCertificates(this IServiceCollection data, string configPath = "server.certificates")
{
var configs = Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath(configPath);
return data.UseCertificates(configs);
}
///
/// 加载https证书
///
///
/// 证书配置
///
public static IServiceCollection UseCertificates(this IServiceCollection data, CertificateInfo[] certificates)
{
if (certificates == null || certificates.Length == 0) return data;
//var certificate = new X509Certificate2(@"L:\Code\sersit-com-iis-0923120142.pfx", "password");
////var dnsName = certificate.GetNameInfo(X509NameType.SimpleName, false);
//var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
//(x.1)构建证书字典
X509Certificate2 defaultCert = null;
Dictionary certMap = new Dictionary();
foreach (var config in certificates)
{
var certificate = new X509Certificate2(CommonHelp.GetAbsPath(config.filePath), config.password);
var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
certMap[dnsName] = certificate;
defaultCert = certificate;
}
if (defaultCert != null)
{
data?.Configure((Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions options) =>
{
options.ConfigureHttpsDefaults(httpsOptions =>
{
httpsOptions.ServerCertificateSelector = (context, name) =>
{
if (name != null && certMap.TryGetValue(name, out var cert))
{
return cert;
}
return defaultCert;
};
});
});
}
return data;
}
}
}