diff --git a/FastGithub.ReverseProxy/KestrelServerOptionsExtensions.cs b/FastGithub.ReverseProxy/KestrelServerOptionsExtensions.cs index 313e394..8be4fe0 100644 --- a/FastGithub.ReverseProxy/KestrelServerOptionsExtensions.cs +++ b/FastGithub.ReverseProxy/KestrelServerOptionsExtensions.cs @@ -1,10 +1,11 @@ using FastGithub.ReverseProxy; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Server.Kestrel.Core; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -12,7 +13,6 @@ using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; -using System.Threading; namespace FastGithub { @@ -22,9 +22,9 @@ namespace FastGithub public static class KestrelServerOptionsExtensions { /// - /// 域名与证书 + /// 域名证书缓存 /// - private static readonly ConcurrentDictionary> domainCerts = new(); + private static readonly IMemoryCache domainCertCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); /// /// 监听https的反向代理 @@ -51,6 +51,7 @@ namespace FastGithub /// /// 生成根证书 + /// 10年 /// /// /// @@ -64,8 +65,8 @@ namespace FastGithub File.Delete(caPublicCerPath); File.Delete(caPrivateKeyPath); - var validFrom = DateTime.Today.AddYears(-10); - var validTo = DateTime.Today.AddYears(50); + var validFrom = DateTime.Today.AddDays(-1); + var validTo = DateTime.Today.AddYears(10); CertGenerator.GenerateBySelf(new[] { nameof(FastGithub) }, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath); } @@ -79,7 +80,7 @@ namespace FastGithub { if (OperatingSystem.IsWindows() == false) { - logger.LogWarning($"不支持自动安装根证书{caPublicCerPath}:请根据你的系统平台情况安装和信任根证书"); + logger.LogWarning($"不支持自动安装证书{caPublicCerPath}:请手动安装证书到根证书颁发机构"); } else { @@ -96,7 +97,7 @@ namespace FastGithub } catch (Exception) { - logger.LogWarning($"安装根证书{caPublicCerPath}失败:请手动安装到“将所有的证书都放入下载存储”\\“受信任的根证书颁发机构”"); + logger.LogWarning($"安装证书{caPublicCerPath}失败:请手动安装到“将所有的证书都放入下载存储”\\“受信任的根证书颁发机构”"); } } } @@ -110,17 +111,18 @@ namespace FastGithub /// private static X509Certificate2 GetDomainCert(string? domain, string caPublicCerPath, string caPrivateKeyPath) { - return domainCerts.GetOrAdd(domain ?? string.Empty, GetOrCreateCert).Value; + return domainCertCache.GetOrCreate(domain ?? string.Empty, GetOrCreateCert); - Lazy GetOrCreateCert(string host) + // 生成域名的1年证书 + X509Certificate2 GetOrCreateCert(ICacheEntry entry) { - return new Lazy(() => - { - var domains = GetDomains(host).Distinct(); - var validFrom = DateTime.Today.AddYears(-1); - var validTo = DateTime.Today.AddYears(10); - return CertGenerator.GenerateByCa(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath); - }, LazyThreadSafetyMode.ExecutionAndPublication); + var host = (string)entry.Key; + var domains = GetDomains(host).Distinct(); + var validFrom = DateTime.Today.AddDays(-1); + var validTo = DateTime.Today.AddYears(1); + + entry.SetAbsoluteExpiration(validTo); + return CertGenerator.GenerateByCa(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath); } }