Przeglądaj źródła

TlsHandshakeCallbackOptions

陈国伟 2 lat temu
rodzic
commit
51170e68b1
1 zmienionych plików z 16 dodań i 3 usunięć
  1. 16 3
      FastGithub.HttpServer/KestrelServerExtensions.cs

+ 16 - 3
FastGithub.HttpServer/KestrelServerExtensions.cs

@@ -10,6 +10,9 @@ using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using Microsoft.Extensions.Options;
 using System;
 using System;
+using System.Net.Security;
+using System.Security.Cryptography.X509Certificates;
+using System.Threading.Tasks;
 
 
 namespace FastGithub
 namespace FastGithub
 {
 {
@@ -149,7 +152,7 @@ namespace FastGithub
             var certService = listen.ApplicationServices.GetRequiredService<CertService>();
             var certService = listen.ApplicationServices.GetRequiredService<CertService>();
             certService.CreateCaCertIfNotExists();
             certService.CreateCaCertIfNotExists();
             certService.InstallAndTrustCaCert();
             certService.InstallAndTrustCaCert();
-            return listen.UseTls(https => https.ServerCertificateSelector = (ctx, domain) => certService.GetOrCreateServerCert(domain));
+            return listen.UseTls(domain => certService.GetOrCreateServerCert(domain));
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -158,13 +161,23 @@ namespace FastGithub
         /// <param name="listen"></param>
         /// <param name="listen"></param>
         /// <param name="configureOptions">https配置</param>
         /// <param name="configureOptions">https配置</param>
         /// <returns></returns>
         /// <returns></returns>
-        private static ListenOptions UseTls(this ListenOptions listen, Action<HttpsConnectionAdapterOptions> configureOptions)
+        private static ListenOptions UseTls(this ListenOptions listen, Func<string, X509Certificate2> certFactory)
         {
         {
             var invadeMiddleware = listen.ApplicationServices.GetRequiredService<TlsInvadeMiddleware>();
             var invadeMiddleware = listen.ApplicationServices.GetRequiredService<TlsInvadeMiddleware>();
             var restoreMiddleware = listen.ApplicationServices.GetRequiredService<TlsRestoreMiddleware>();
             var restoreMiddleware = listen.ApplicationServices.GetRequiredService<TlsRestoreMiddleware>();
 
 
             listen.Use(next => context => invadeMiddleware.InvokeAsync(next, context));
             listen.Use(next => context => invadeMiddleware.InvokeAsync(next, context));
-            listen.UseHttps(configureOptions);
+            listen.UseHttps(new TlsHandshakeCallbackOptions
+            {
+                OnConnection = context =>
+                {
+                    var options = new SslServerAuthenticationOptions
+                    {
+                        ServerCertificate = certFactory(context.ClientHelloInfo.ServerName)
+                    };
+                    return ValueTask.FromResult(options);
+                },
+            });
             listen.Use(next => context => restoreMiddleware.InvokeAsync(next, context));
             listen.Use(next => context => restoreMiddleware.InvokeAsync(next, context));
             return listen;
             return listen;
         }
         }