IServiceCollectionExtensions_UseCertificates.cs 3.0 KB

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