IServiceCollectionExtensions_UseCertificates.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Microsoft.Extensions.DependencyInjection;
  2. using System.Collections.Generic;
  3. using System.Security.Cryptography.X509Certificates;
  4. using Vit.Core.Util.Common;
  5. using Vit.WebHost.Extensions.UseCertificates;
  6. namespace Vit.Extensions
  7. {
  8. public static partial class IServiceCollectionExtensions_UseCertificates
  9. {
  10. /// <summary>
  11. /// 加载https证书
  12. /// <example>
  13. /// <code>
  14. /// //appsettings.json
  15. /// //...
  16. /// "server": {
  17. /// /* https证书配置,可不指定。若urls中指定了https协议,请在此指定对应的https证书 */
  18. /// "certificates": [
  19. /// {
  20. /// "filePath": "data/serset-com-iis-0923120142.pfx",
  21. /// "password": "password"
  22. /// }
  23. /// ]
  24. /// },
  25. /// //...
  26. /// </code>
  27. /// </example>
  28. ///
  29. /// </summary>
  30. /// <param name="data"></param>
  31. /// <param name="configPath">在appsettings.json文件中的路径。默认:"server.certificates"。</param>
  32. /// <returns></returns>
  33. public static IServiceCollection UseCertificates(this IServiceCollection data, string configPath = "server.certificates")
  34. {
  35. var configs = Vit.Core.Util.ConfigurationManager.Appsettings.json.GetByPath<CertificateInfo[]>(configPath);
  36. return data.UseCertificates(configs);
  37. }
  38. /// <summary>
  39. /// 加载https证书
  40. /// </summary>
  41. /// <param name="data"></param>
  42. /// <param name="certificates">证书配置</param>
  43. /// <returns></returns>
  44. public static IServiceCollection UseCertificates(this IServiceCollection data, CertificateInfo[] certificates)
  45. {
  46. if (certificates == null || certificates.Length == 0) return data;
  47. //var certificate = new X509Certificate2(@"L:\Code\sersit-com-iis-0923120142.pfx", "password");
  48. ////var dnsName = certificate.GetNameInfo(X509NameType.SimpleName, false);
  49. //var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
  50. //(x.1)构建证书字典
  51. X509Certificate2 defaultCert = null;
  52. Dictionary<string, X509Certificate2> certMap = new Dictionary<string, X509Certificate2>();
  53. foreach (var config in certificates)
  54. {
  55. var certificate = new X509Certificate2(CommonHelp.GetAbsPath(config.filePath), config.password);
  56. var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
  57. certMap[dnsName] = certificate;
  58. defaultCert = certificate;
  59. }
  60. if (defaultCert != null)
  61. {
  62. data?.Configure((Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions options) =>
  63. {
  64. options.ConfigureHttpsDefaults(httpsOptions =>
  65. {
  66. httpsOptions.ServerCertificateSelector = (context, name) =>
  67. {
  68. if (name != null && certMap.TryGetValue(name, out var cert))
  69. {
  70. return cert;
  71. }
  72. return defaultCert;
  73. };
  74. });
  75. });
  76. }
  77. return data;
  78. }
  79. }
  80. }