diff --git a/FastGithub.Dns/DnsServiceCollectionExtensions.cs b/FastGithub.Dns/DnsServiceCollectionExtensions.cs index 48ccd0f..c36bfe6 100644 --- a/FastGithub.Dns/DnsServiceCollectionExtensions.cs +++ b/FastGithub.Dns/DnsServiceCollectionExtensions.cs @@ -18,10 +18,9 @@ namespace FastGithub public static IServiceCollection AddGithubDns(this IServiceCollection services, IConfiguration configuration) { var assembly = typeof(DnsServiceCollectionExtensions).Assembly; - return services + return services .AddServiceAndOptions(assembly, configuration) - .AddHostedService() - .AddGithubScanner(configuration); + .AddHostedService(); } } } diff --git a/FastGithub.Dns/FastGithub.Dns.csproj b/FastGithub.Dns/FastGithub.Dns.csproj index b0068ab..a21c360 100644 --- a/FastGithub.Dns/FastGithub.Dns.csproj +++ b/FastGithub.Dns/FastGithub.Dns.csproj @@ -2,11 +2,7 @@ net5.0 - - - - - + diff --git a/FastGithub.Dns/GithubRequestResolver.cs b/FastGithub.Dns/GithubRequestResolver.cs index 1948342..9c15d20 100644 --- a/FastGithub.Dns/GithubRequestResolver.cs +++ b/FastGithub.Dns/GithubRequestResolver.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; @@ -55,6 +56,7 @@ namespace FastGithub.Dns if (address != null) { + address = IPAddress.Loopback; var ttl = this.options.CurrentValue.GithubTTL; var record = new IPAddressResourceRecord(question.Name, address, ttl); response.AnswerRecords.Add(record); diff --git a/FastGithub.ReverseProxy/CertGenerator.cs b/FastGithub.ReverseProxy/CertGenerator.cs new file mode 100644 index 0000000..9b3eebc --- /dev/null +++ b/FastGithub.ReverseProxy/CertGenerator.cs @@ -0,0 +1,159 @@ +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Asn1.X9; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Operators; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Pkcs; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.X509; +using Org.BouncyCastle.X509.Extension; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; + +namespace FastGithub.ReverseProxy +{ + /// + /// 证书生成器 + /// + static class CertGenerator + { + private static readonly SecureRandom secureRandom = new(); + + /// + /// 生成CA签名证书 + /// + /// + /// + /// + /// + /// + /// + /// + public static X509Certificate2 Generate(IEnumerable domains, int keySizeBits, DateTime validFrom, DateTime validTo, string caPublicCerPath, string caPrivateKeyPath) + { + if (File.Exists(caPublicCerPath) == false) + { + throw new FileNotFoundException(caPublicCerPath); + } + + if (File.Exists(caPrivateKeyPath) == false) + { + throw new FileNotFoundException(caPublicCerPath); + } + + using var pubReader = new StreamReader(caPublicCerPath, Encoding.ASCII); + var caCert = (X509Certificate)new PemReader(pubReader).ReadObject(); + + using var priReader = new StreamReader(caPrivateKeyPath, Encoding.ASCII); + var reader = new PemReader(priReader); + var caPrivateKey = ((AsymmetricCipherKeyPair)reader.ReadObject()).Private; + + var caSubjectName = GetSubjectName(caCert); + var keys = GenerateRsaKeyPair(keySizeBits); + var cert = GenerateCertificate(domains, keys.Public, validFrom, validTo, caSubjectName, caCert.GetPublicKey(), caPrivateKey, null); + + return GeneratePfx(cert, keys.Private, password: null); + } + + /// + /// 生成私钥 + /// + /// + /// + private static AsymmetricCipherKeyPair GenerateRsaKeyPair(int length) + { + var keygenParam = new KeyGenerationParameters(secureRandom, length); + var keyGenerator = new RsaKeyPairGenerator(); + keyGenerator.Init(keygenParam); + return keyGenerator.GenerateKeyPair(); + } + + /// + /// 生成证书 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + private static X509Certificate GenerateCertificate(IEnumerable domains, AsymmetricKeyParameter subjectPublic, DateTime validFrom, DateTime validTo, string issuerName, AsymmetricKeyParameter issuerPublic, AsymmetricKeyParameter issuerPrivate, int? CA_PathLengthConstraint) + { + var signatureFactory = issuerPrivate is ECPrivateKeyParameters + ? new Asn1SignatureFactory(X9ObjectIdentifiers.ECDsaWithSha256.ToString(), issuerPrivate) + : new Asn1SignatureFactory(PkcsObjectIdentifiers.Sha256WithRsaEncryption.ToString(), issuerPrivate); + + var certGenerator = new X509V3CertificateGenerator(); + certGenerator.SetIssuerDN(new X509Name("CN=" + issuerName)); + certGenerator.SetSubjectDN(new X509Name("CN=" + domains.First())); + certGenerator.SetSerialNumber(BigInteger.ProbablePrime(120, new Random())); + certGenerator.SetNotBefore(validFrom); + certGenerator.SetNotAfter(validTo); + certGenerator.SetPublicKey(subjectPublic); + + if (issuerPublic != null) + { + var akis = new AuthorityKeyIdentifierStructure(issuerPublic); + certGenerator.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, akis); + } + if (CA_PathLengthConstraint != null && CA_PathLengthConstraint >= 0) + { + var extension = new X509Extension(true, new DerOctetString(new BasicConstraints(CA_PathLengthConstraint.Value))); + certGenerator.AddExtension(X509Extensions.BasicConstraints, extension.IsCritical, extension.GetParsedValue()); + } + + var names = domains.Select(domain => new GeneralName(GeneralName.DnsName, domain)).ToArray(); + var subjectAltName = new GeneralNames(names); + certGenerator.AddExtension(X509Extensions.SubjectAlternativeName, false, subjectAltName); + return certGenerator.Generate(signatureFactory); + } + + /// + /// 生成pfx + /// + /// + /// + /// + /// + private static X509Certificate2 GeneratePfx(X509Certificate cert, AsymmetricKeyParameter privateKey, string? password) + { + var subject = GetSubjectName(cert); + var pkcs12Store = new Pkcs12Store(); + var certEntry = new X509CertificateEntry(cert); + pkcs12Store.SetCertificateEntry(subject, certEntry); + pkcs12Store.SetKeyEntry(subject, new AsymmetricKeyEntry(privateKey), new[] { certEntry }); + + using var pfxStream = new MemoryStream(); + pkcs12Store.Save(pfxStream, password?.ToCharArray(), secureRandom); + return new X509Certificate2(pfxStream.ToArray()); + } + + + /// + /// 获取Subject + /// + /// + /// + private static string GetSubjectName(X509Certificate cert) + { + var subject = cert.SubjectDN.ToString(); + if (subject.StartsWith("cn=", StringComparison.OrdinalIgnoreCase)) + { + subject = subject[3..]; + } + return subject; + } + } +} diff --git a/FastGithub.ReverseProxy/FastGithub.ReverseProxy.csproj b/FastGithub.ReverseProxy/FastGithub.ReverseProxy.csproj new file mode 100644 index 0000000..818a7d8 --- /dev/null +++ b/FastGithub.ReverseProxy/FastGithub.ReverseProxy.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + + + + + + diff --git a/FastGithub.ReverseProxy/GithubDnsHttpHandler.cs b/FastGithub.ReverseProxy/GithubDnsHttpHandler.cs new file mode 100644 index 0000000..64c29da --- /dev/null +++ b/FastGithub.ReverseProxy/GithubDnsHttpHandler.cs @@ -0,0 +1,55 @@ +using FastGithub.Scanner; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace FastGithub.ReverseProxy +{ + /// + /// Github的dns解析的httpHandler + /// 使扫描索结果作为github的https请求的域名解析 + /// + sealed class GithubDnsHttpHandler : DelegatingHandler + { + private readonly IGithubScanResults scanResults; + + /// + /// Github的dns解析的httpHandler + /// + /// + /// + public GithubDnsHttpHandler(IGithubScanResults scanResults, HttpMessageHandler handler) + : base(handler) + { + this.scanResults = scanResults; + } + + /// + /// 发送消息 + /// + /// + /// + /// + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var uri = request.RequestUri; + if (uri != null && uri.HostNameType == UriHostNameType.Dns) + { + var address = this.scanResults.FindBestAddress(uri.Host); + if (address != null) + { + var builder = new UriBuilder(uri) + { + Host = address.ToString() + }; + request.RequestUri = builder.Uri; + request.Headers.Host = uri.Host; + } + } + + return await base.SendAsync(request, cancellationToken); + } + } +} diff --git a/FastGithub.ReverseProxy/ListenOptionsHttpsExtensions.cs b/FastGithub.ReverseProxy/ListenOptionsHttpsExtensions.cs new file mode 100644 index 0000000..40f051e --- /dev/null +++ b/FastGithub.ReverseProxy/ListenOptionsHttpsExtensions.cs @@ -0,0 +1,36 @@ +using FastGithub.ReverseProxy; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Server.Kestrel.Core; +using System; +using System.Collections.Concurrent; +using System.Security.Cryptography.X509Certificates; + +namespace FastGithub +{ + public static class ListenOptionsHttpsExtensions + { + /// + /// 应用fastGihub的https + /// + /// + /// + /// + /// + public static ListenOptions UseGithubHttps(this ListenOptions listenOptions, string caPublicCerPath, string caPrivateKeyPath) + { + return listenOptions.UseHttps(https => + { + var certs = new ConcurrentDictionary(); + https.ServerCertificateSelector = (ctx, domain) => + certs.GetOrAdd(domain, d => + CertGenerator.Generate( + new[] { d }, + 2048, + DateTime.Today.AddYears(-1), + DateTime.Today.AddYears(1), + caPublicCerPath, + caPrivateKeyPath)); + }); + } + } +} diff --git a/FastGithub.ReverseProxy/NoneSniHttpClient.cs b/FastGithub.ReverseProxy/NoneSniHttpClient.cs new file mode 100644 index 0000000..43f3fe1 --- /dev/null +++ b/FastGithub.ReverseProxy/NoneSniHttpClient.cs @@ -0,0 +1,62 @@ +using FastGithub.Scanner; +using System.IO; +using System.Net.Http; +using System.Net.Security; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace FastGithub.ReverseProxy +{ + /// + /// 去掉Sni的HttpClient + /// + sealed class NoneSniHttpClient : HttpMessageInvoker + { + /// + /// 去掉Sni的HttpClient + /// + /// + public NoneSniHttpClient(IGithubScanResults githubScanResults) + : base(CreateNoneSniHttpHandler(githubScanResults), disposeHandler: false) + { + } + + /// + /// 去掉Sni的HttpHandler + /// + private static HttpMessageHandler CreateNoneSniHttpHandler(IGithubScanResults githubScanResults) + { + var httpHandler = new SocketsHttpHandler + { + AllowAutoRedirect = false, + UseCookies = false, + UseProxy = false, + ConnectCallback = ConnectCallback + }; + + return new GithubDnsHttpHandler(githubScanResults, httpHandler); + } + + /// + /// 连接回调 + /// + /// + /// + /// + private static async ValueTask ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellationToken) + { + var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); + await socket.ConnectAsync(context.DnsEndPoint, cancellationToken); + var stream = new NetworkStream(socket, ownsSocket: true); + if (context.InitialRequestMessage.Headers.Host == null) + { + return stream; + } + + var sslStream = new SslStream(stream, leaveInnerStreamOpen: false, delegate { return true; }); + await sslStream.AuthenticateAsClientAsync(string.Empty, null, false); + return sslStream; + } + } +} diff --git a/FastGithub.ReverseProxy/ReverseProxyApplicationBuilderExtensions.cs b/FastGithub.ReverseProxy/ReverseProxyApplicationBuilderExtensions.cs new file mode 100644 index 0000000..01ac291 --- /dev/null +++ b/FastGithub.ReverseProxy/ReverseProxyApplicationBuilderExtensions.cs @@ -0,0 +1,34 @@ +using FastGithub.ReverseProxy; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Yarp.ReverseProxy.Forwarder; + +namespace FastGithub +{ + /// + /// gitub反向代理的中间件扩展 + /// + public static class ReverseProxyApplicationBuilderExtensions + { + /// + /// 使用gitub反向代理中间件 + /// + /// + /// + public static IApplicationBuilder UseGithubReverseProxy(this IApplicationBuilder app) + { + var httpForwarder = app.ApplicationServices.GetRequiredService(); + var httpClient = app.ApplicationServices.GetRequiredService(); + + app.Use(next => async context => + { + var hostString = context.Request.Host; + var port = hostString.Port ?? 443; + var destinationPrefix = $"http://{hostString.Host}:{port}/"; + await httpForwarder.SendAsync(context, destinationPrefix, httpClient); + }); + + return app; + } + } +} diff --git a/FastGithub.ReverseProxy/ReverseProxyServiceCollectionExtensions.cs b/FastGithub.ReverseProxy/ReverseProxyServiceCollectionExtensions.cs new file mode 100644 index 0000000..f9e658a --- /dev/null +++ b/FastGithub.ReverseProxy/ReverseProxyServiceCollectionExtensions.cs @@ -0,0 +1,24 @@ +using FastGithub.ReverseProxy; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace FastGithub +{ + /// + /// gitub反向代理的服务注册扩展 + /// + public static class ReverseProxyServiceCollectionExtensions + { + /// + /// gitub反向代理 + /// + /// + /// + public static IServiceCollection AddGithubReverseProxy(this IServiceCollection services) + { + services.AddHttpForwarder(); + services.AddSingleton(); + return services; + } + } +} diff --git a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs index 0a75332..e90efb3 100644 --- a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs +++ b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs @@ -30,6 +30,7 @@ namespace FastGithub .SetHandlerLifetime(TimeSpan.FromMinutes(5d)) .ConfigureHttpClient(httpClient => { + httpClient.Timeout = TimeSpan.FromSeconds(10d); httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*"); httpClient.DefaultRequestHeaders.UserAgent.Add(defaultUserAgent); }) diff --git a/FastGithub.sln b/FastGithub.sln index ef5bf32..6923f45 100644 --- a/FastGithub.sln +++ b/FastGithub.sln @@ -11,7 +11,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Dns", "FastGithu EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Scanner", "FastGithub.Scanner\FastGithub.Scanner.csproj", "{7F24CD2F-07C0-4002-A534-80688DE95ECF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FastGithub.Upgrade", "FastGithub.Upgrade\FastGithub.Upgrade.csproj", "{8239A077-A84C-4FDF-A204-02A2DE4243F3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Upgrade", "FastGithub.Upgrade\FastGithub.Upgrade.csproj", "{8239A077-A84C-4FDF-A204-02A2DE4243F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FastGithub.ReverseProxy", "FastGithub.ReverseProxy\FastGithub.ReverseProxy.csproj", "{28326D0F-B0FB-4B6B-A65A-C69ACB72CAD8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +41,10 @@ Global {8239A077-A84C-4FDF-A204-02A2DE4243F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {8239A077-A84C-4FDF-A204-02A2DE4243F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {8239A077-A84C-4FDF-A204-02A2DE4243F3}.Release|Any CPU.Build.0 = Release|Any CPU + {28326D0F-B0FB-4B6B-A65A-C69ACB72CAD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28326D0F-B0FB-4B6B-A65A-C69ACB72CAD8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28326D0F-B0FB-4B6B-A65A-C69ACB72CAD8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28326D0F-B0FB-4B6B-A65A-C69ACB72CAD8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FastGithub/FastGithub.csproj b/FastGithub/FastGithub.csproj index dc0ec9b..3594d20 100644 --- a/FastGithub/FastGithub.csproj +++ b/FastGithub/FastGithub.csproj @@ -1,4 +1,4 @@ - + Exe @@ -19,6 +19,7 @@ + @@ -32,6 +33,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/FastGithub/FastGithub_CA.cer b/FastGithub/FastGithub_CA.cer new file mode 100644 index 0000000..57b2275 --- /dev/null +++ b/FastGithub/FastGithub_CA.cer @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC2DCCAcCgAwIBAgIQAKaUqwPmF9dDFtqNp34mRTANBgkqhkiG9w0BAQsFADAY +MRYwFAYDVQQDDA1GYXN0R2l0aHViX0NBMCAXDTExMDcxMzAwMDAwMFoYDzI1MjEw +NzEzMDAwMDAwWjAYMRYwFAYDVQQDDA1GYXN0R2l0aHViX0NBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1vNFkTGacoKdOY+H8Va7BN/z+nXyUHI1aZGC +11uzRVggi7EDxL2ThufzrQNEMqmh7aI6UbmnFMee+UtzexBSl2x8sH0uOPL31Pbh +fsrrgjMW0p8doApaTlEVyrXI5SVEapf+B13y/Nu6e2PQ4gRT4WZaBfLgqQdcaT9/ +RdaexznlRYzet6HAKf/Hvs5tkbWkLY9mvctcMWm998wjVVD2vTyZ7Pe7s7L2w/fG +mcz0svonr18zI+kHK/hK/2u/jvnmC8HpvhnDbNp7brOvR0TF6oYjKB20Zicy32UK +0/PekVN9T8dzOwjkZXJ0xI7RRVLOLG1qkO8z8BhyznjQLLZSLwIDAQABoxwwGjAY +BgNVHREEETAPgg1GYXN0R2l0aHViX0NBMA0GCSqGSIb3DQEBCwUAA4IBAQCYR68q +oKqBiNKlWgaaY8o2w7PGL0NZ2QVGlZp4Yl8Jj60qx587TSN9YTjMgNpZnkCYJZbQ +AhJAcwVspFsAq90SG/md0A6o3TRHSEV2HJIvAoMTiT/LLG+ZU61/NxMl0WxoQPKz +OcleOo+fCklove9jYIhHsls30eQv/NGn+pKhnCI9VEC+sUxbxQd4LJQbBYouNV6I +Sd8axEazqWsQrfX+CvNb2UjH3aaARaPWcacTcVlO5XJz2eDnUzVQOWwgv57sLUmY +xn0HbGp4lATgNeUSBcn7pEHv/yjqraJn2cVl0l/ZaFcYcccYZFrA3qAi14aiGRtu +SSC6OWHrtXwXZnkn +-----END CERTIFICATE----- diff --git a/FastGithub/FastGithub_CA.key b/FastGithub/FastGithub_CA.key new file mode 100644 index 0000000..1758c6d --- /dev/null +++ b/FastGithub/FastGithub_CA.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA1vNFkTGacoKdOY+H8Va7BN/z+nXyUHI1aZGC11uzRVggi7ED +xL2ThufzrQNEMqmh7aI6UbmnFMee+UtzexBSl2x8sH0uOPL31PbhfsrrgjMW0p8d +oApaTlEVyrXI5SVEapf+B13y/Nu6e2PQ4gRT4WZaBfLgqQdcaT9/RdaexznlRYze +t6HAKf/Hvs5tkbWkLY9mvctcMWm998wjVVD2vTyZ7Pe7s7L2w/fGmcz0svonr18z +I+kHK/hK/2u/jvnmC8HpvhnDbNp7brOvR0TF6oYjKB20Zicy32UK0/PekVN9T8dz +OwjkZXJ0xI7RRVLOLG1qkO8z8BhyznjQLLZSLwIDAQABAoIBABamHILviJgfRiTO +CGN4IY2icWlHK0ipuBIPGIvLqEiawBcoCD8fQJ+66hSlXva9pAfPi7iXyNCqNgiL +mDfz4Nf+wOax0gCDLXT9rIX5KLaX3oRD6tG1tY1CAvtQi0IF2r8mk8g/8H4PQweE +XXqrPRFngP3WeTCmS2j1nVoFAsb4E7ZOKVVD3z6wILWHUfXuAeV/R1/pqbDvc4Yn +i2+PZvHZVjftkOqy7FyNE18y2Q198TKWATV1WzrB/Tv0mVoQN/izM9HflERUvvMo +v+I9ZTKrLgnHo5bHprVLRQnHfBJo/SDHJTCtP57sGElUaYl9nFM6k47k0Jp71zID +2UrlY/kCgYEA+ZFD2L+q6y4nDXOngDUiRiLbRJDb2u5pOY6scRHa73KCvq+t+Bih +fxtE9h4EDa1zei/tR6gkQnoIe9Nviikz2YyTrZkqHzAK55who9H6GT9pErNUvXF2 +dnje2KlRcjniMp8vcm1sbYMDEt+NFS2sL8rby97bZQ+V5WjLoYAhAacCgYEA3H2X +IPDudA6cFPczn+19qw76nKdrc3LkxToYdscb/8tH6dX+yrt02t1Ezm81kcMcqeHd +BzbxNeiN2NmBozLQ0SERMDkNJUUFlK3ALdx9USdwTTMywRMnkgLDuRaA6m1QDi24 +RoFDjhEQREbjRD4WxJuzgvLKhF60bQnsAf5R7DkCgYBDpWBii/FkNepX9xVb5wsX +P7N3blxph132P/n13AUgCkXuMehR6zs7HMUggRpQKse2Qu9qEOVjL3jFN5ZwOKLZ +QQV2dKG6Omd6SBPGN9A2r71nWDyL7QlTK4gb6iktcQsi9YsC1S4isPRQVVAEgZC+ +k5noNMv7JLJYsIMhj31i2QKBgQDbg9HVgujz9KOiH+Zuv4PQrQ4GrovEmct3K/q1 +LlAK33iOLnYHoo+ZYpehKojbwLOl0m86QpHtCMVH8mwlbW8F9fTl3LbgtxHyTvW4 +8v50sF4XDfTm0kogDM6NVAEu43vDUfNXhlQaeZSHVUfoZiRGw3j50vyawqrAsBMe +fPNUyQKBgQCMLr1WLgnDiMx7CLXlmKdw45z0UeP+ngZOuPICX9d5DOfznuP8VgS9 +ZiwXHF8PbSdlMFPq9LkPbQTjfTLHXZx0mKl78PcFqwtryXTpUlP1qcfjE6Hl+POD +2OkWyGz7vA80+7ilQscm0L/gLIgwiGQOdBv6akLF8qDwncOX4yWOVQ== +-----END RSA PRIVATE KEY----- diff --git a/FastGithub/Program.cs b/FastGithub/Program.cs index 7f64ae8..967a73d 100644 --- a/FastGithub/Program.cs +++ b/FastGithub/Program.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System.IO; @@ -37,6 +38,22 @@ namespace FastGithub { services.AddAppUpgrade(); services.AddGithubDns(ctx.Configuration); + services.AddGithubReverseProxy(); + services.AddGithubScanner(ctx.Configuration); + }) + .ConfigureWebHostDefaults(web => + { + web.Configure(app => + { + app.UseGithubReverseProxy(); + }); + + web.UseKestrel(kestrel => + { + const string caPublicCerPath = "FastGithub_CA.cer"; + const string caPrivateKeyPath = "FastGithub_CA.key"; + kestrel.ListenLocalhost(443, listen => listen.UseGithubHttps(caPublicCerPath, caPrivateKeyPath)); + }); }); } }