diff --git a/BarrageGrab/ObjectExtension.cs b/BarrageGrab/ObjectExtension.cs index 3b5b7a7..7677490 100644 --- a/BarrageGrab/ObjectExtension.cs +++ b/BarrageGrab/ObjectExtension.cs @@ -91,7 +91,28 @@ namespace BarrageGrab foreach (var item in list) func(item, i++); } - + /// + /// 是否包含 + /// + /// + /// + /// + public static bool In(this T obj, params T[] args) + { + return args.Contains(obj); + } + + /// + /// 是否包含 + /// + /// + /// + /// + public static bool LikeIn(this string str, params string[] args) + { + return args.Any(a => str.Contains(a)); + } + public static CookieCollection ToCookies(this string cookieStr, string domain) { var cookies = new CookieCollection(); diff --git a/BarrageGrab/Properties/AssemblyInfo.cs b/BarrageGrab/Properties/AssemblyInfo.cs index a36c1ed..4b295b0 100644 --- a/BarrageGrab/Properties/AssemblyInfo.cs +++ b/BarrageGrab/Properties/AssemblyInfo.cs @@ -33,6 +33,6 @@ using System.Runtime.InteropServices; //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.4.0")] -[assembly: AssemblyFileVersion("2.7.4.0")] +[assembly: AssemblyVersion("2.7.6.0")] +[assembly: AssemblyFileVersion("2.7.6.0")] [assembly: NeutralResourcesLanguage("zh-CN")] diff --git a/BarrageGrab/Proxy/TitaniumProxy.cs b/BarrageGrab/Proxy/TitaniumProxy.cs index b202bdc..8eb58f2 100644 --- a/BarrageGrab/Proxy/TitaniumProxy.cs +++ b/BarrageGrab/Proxy/TitaniumProxy.cs @@ -16,6 +16,8 @@ using Titanium.Web.Proxy.EventArguments; using Titanium.Web.Proxy.Http; using Titanium.Web.Proxy.Models; using Titanium.Web.Proxy.StreamExtended.Network; +using System.Security.Cryptography.X509Certificates; +using System.Security.Cryptography; namespace BarrageGrab.Proxy { @@ -65,7 +67,7 @@ namespace BarrageGrab.Proxy Logger.LogWarn("代理环境设置失败:" + ex.Message); } } - + public TitaniumProxy() { //注册系统代理 @@ -75,9 +77,10 @@ namespace BarrageGrab.Proxy proxyServer.ReuseSocket = false; proxyServer.EnableConnectionPool = true; proxyServer.ForwardToUpstreamGateway = true; - proxyServer.CertificateManager.SaveFakeCertificates = true; - proxyServer.CertificateManager.RootCertificate = proxyServer.CertificateManager.LoadRootCertificate(); + proxyServer.CertificateManager.CertificateValidDays = 365 * 10; + proxyServer.CertificateManager.SaveFakeCertificates = true; + proxyServer.CertificateManager.RootCertificate = GetCert(); if (proxyServer.CertificateManager.RootCertificate == null) { Logger.PrintColor("正在进行证书安装,需要信任该证书才可进行https解密,若有提示请确定"); @@ -97,6 +100,62 @@ namespace BarrageGrab.Proxy proxyServer.AddEndPoint(explicitEndPoint); } + private X509Certificate2 GetCert() + { + X509Certificate2 result = proxyServer.CertificateManager.LoadRootCertificate(); + + if (result != null) return result; + + // 打开“受信任的根证书颁发机构”存储区 + using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadOnly); + + // 遍历证书集合 + foreach (X509Certificate2 cert in store.Certificates) + { + try + { + // 尝试使用证书创建 X509Certificate2 实例 + X509Certificate2 certificate = new X509Certificate2(cert); + + //判断过期 + if (DateTime.Now > certificate.NotAfter) continue; + + //判断黑名单 + var black = new string[] { "localhost" }; + if (certificate.FriendlyName.ToLower().LikeIn(black) || + certificate.Subject.ToLower().LikeIn(black) + ) continue; + + + if (certificate.FriendlyName.ToLower().LikeIn("titanium")) + { + result = certificate; + break; + } + + // 打印证书信息 + //Console.WriteLine("证书: " + certificate.Subject); + //Console.WriteLine("颁发者: " + certificate.Issuer); + //Console.WriteLine("有效期: " + certificate.NotBefore + " - " + certificate.NotAfter); + + //result = certificate; + //break; + } + catch (CryptographicException ex) + { + //捕获加密异常,如果证书需要密码,这里会抛出异常 + throw new Exception("证书加载失败: " + ex.Message); + } + } + + store.Close(); + } + + return result; + } + public override void SetUpstreamProxy(string upstreamProxyAddr) { if (string.IsNullOrWhiteSpace(upstreamProxyAddr)) return; @@ -208,7 +267,7 @@ namespace BarrageGrab.Proxy if (uri.Contains(BARRAGE_POOL_PATH) && contentType.Contains("application/protobuffer")) { var payload = await e.GetResponseBody(); - + base.FireOnFetchResponse(new HttpResponseEventArgs() { HttpClient = e.HttpClient, @@ -585,7 +644,7 @@ namespace BarrageGrab.Proxy /// override public void Start() { - proxyServer.Start(AppSetting.Current.UsedProxy); + proxyServer.Start(false); if (AppSetting.Current.UsedProxy) { base.RegisterSystemProxy();