fix bug
This commit is contained in:
parent
a5a5ab6986
commit
6b15437abd
@ -12,7 +12,7 @@ namespace FastGithub.Dns
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// dns后台服务
|
/// dns后台服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
sealed class DnsHostedService : IHostedService
|
sealed class DnsHostedService : BackgroundService
|
||||||
{
|
{
|
||||||
private readonly DnsServer dnsServer;
|
private readonly DnsServer dnsServer;
|
||||||
private readonly IOptions<DnsOptions> options;
|
private readonly IOptions<DnsOptions> options;
|
||||||
@ -31,22 +31,51 @@ namespace FastGithub.Dns
|
|||||||
ILogger<DnsHostedService> logger)
|
ILogger<DnsHostedService> logger)
|
||||||
{
|
{
|
||||||
this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
|
this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
|
||||||
|
this.dnsServer.Listening += DnsServer_Listening;
|
||||||
|
this.dnsServer.Errored += DnsServer_Errored;
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启动dns服务
|
/// 监听后
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="sender"></param>
|
||||||
/// <returns></returns>
|
/// <param name="e"></param>
|
||||||
public Task StartAsync(CancellationToken cancellationToken)
|
private void DnsServer_Listening(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
this.dnsServer.Listen();
|
|
||||||
this.logger.LogInformation("dns服务启动成功");
|
this.logger.LogInformation("dns服务启动成功");
|
||||||
this.dnsAddresses = this.SetNameServers(IPAddress.Loopback, this.options.Value.UpStream);
|
this.dnsAddresses = this.SetNameServers(IPAddress.Loopback, this.options.Value.UpStream);
|
||||||
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
/// <summary>
|
||||||
|
/// dns异常
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
private void DnsServer_Errored(object? sender, DnsServer.ErroredEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Exception is not OperationCanceledException)
|
||||||
|
{
|
||||||
|
this.logger.LogError($"dns服务异常:{e.Exception.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 启动dns
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="stoppingToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.dnsServer.Listen();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
this.logger.LogWarning($"dns服务启动失败:{ex.Message}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -54,7 +83,7 @@ namespace FastGithub.Dns
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public Task StopAsync(CancellationToken cancellationToken)
|
public override Task StopAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.dnsServer.Dispose();
|
this.dnsServer.Dispose();
|
||||||
this.logger.LogInformation("dns服务已终止");
|
this.logger.LogInformation("dns服务已终止");
|
||||||
|
|||||||
@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace FastGithub
|
namespace FastGithub
|
||||||
{
|
{
|
||||||
@ -14,6 +15,11 @@ namespace FastGithub
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class KestrelServerOptionsExtensions
|
public static class KestrelServerOptionsExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 域名与证书
|
||||||
|
/// </summary>
|
||||||
|
private static readonly ConcurrentDictionary<string, Lazy<X509Certificate2>> domainCerts = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听github的反向代理
|
/// 监听github的反向代理
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -26,8 +32,29 @@ namespace FastGithub
|
|||||||
var logger = loggerFactory.CreateLogger($"{nameof(FastGithub)}{nameof(ReverseProxy)}");
|
var logger = loggerFactory.CreateLogger($"{nameof(FastGithub)}{nameof(ReverseProxy)}");
|
||||||
TryInstallCaCert(caPublicCerPath, logger);
|
TryInstallCaCert(caPublicCerPath, logger);
|
||||||
|
|
||||||
kestrel.ListenAnyIP(443, listen => listen.UseGithubHttps(caPublicCerPath, caPrivateKeyPath));
|
kestrel.ListenAnyIP(443, listen =>
|
||||||
|
listen.UseHttps(https =>
|
||||||
|
https.ServerCertificateSelector = (ctx, domain) =>
|
||||||
|
GetOrCreateCert(domain)));
|
||||||
|
|
||||||
logger.LogInformation("反向代理服务启动成功");
|
logger.LogInformation("反向代理服务启动成功");
|
||||||
|
|
||||||
|
|
||||||
|
X509Certificate2 GetOrCreateCert(string key)
|
||||||
|
{
|
||||||
|
if (key == string.Empty)
|
||||||
|
{
|
||||||
|
key = "github.com";
|
||||||
|
}
|
||||||
|
|
||||||
|
return domainCerts.GetOrAdd(key, domain => new Lazy<X509Certificate2>(() =>
|
||||||
|
{
|
||||||
|
var domains = new[] { domain };
|
||||||
|
var validFrom = DateTime.Today.AddYears(-1);
|
||||||
|
var validTo = DateTime.Today.AddYears(10);
|
||||||
|
return CertGenerator.Generate(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath);
|
||||||
|
}, LazyThreadSafetyMode.ExecutionAndPublication)).Value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -57,32 +84,5 @@ namespace FastGithub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 应用fastGihub的https
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="listenOptions"></param>
|
|
||||||
/// <param name="caPublicCerPath"></param>
|
|
||||||
/// <param name="caPrivateKeyPath"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static ListenOptions UseGithubHttps(this ListenOptions listenOptions, string caPublicCerPath, string caPrivateKeyPath)
|
|
||||||
{
|
|
||||||
return listenOptions.UseHttps(https =>
|
|
||||||
{
|
|
||||||
var certs = new ConcurrentDictionary<string, X509Certificate2>();
|
|
||||||
https.ServerCertificateSelector = (ctx, domain) => certs.GetOrAdd(domain, CreateCert);
|
|
||||||
});
|
|
||||||
|
|
||||||
X509Certificate2 CreateCert(string domain)
|
|
||||||
{
|
|
||||||
if (domain == string.Empty)
|
|
||||||
{
|
|
||||||
domain = "github.com";
|
|
||||||
}
|
|
||||||
var domains = new[] { domain };
|
|
||||||
var validFrom = DateTime.Today.AddYears(-1);
|
|
||||||
var validTo = DateTime.Today.AddYears(10);
|
|
||||||
return CertGenerator.Generate(domains, 2048, validFrom, validTo, caPublicCerPath, caPrivateKeyPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user