77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Security.Cryptography;
 | |
| using System.Security.Cryptography.X509Certificates;
 | |
| using Microsoft.AspNetCore.Builder;
 | |
| using Microsoft.AspNetCore.Hosting;
 | |
| using Microsoft.AspNetCore.Server.Kestrel.Core;
 | |
| using Microsoft.Extensions.Configuration;
 | |
| 
 | |
| namespace DysonNetwork.Shared.Http;
 | |
| 
 | |
| public static class KestrelConfiguration
 | |
| {
 | |
|     public static WebApplicationBuilder ConfigureAppKestrel(
 | |
|         this WebApplicationBuilder builder,
 | |
|         IConfiguration configuration,
 | |
|         long maxRequestBodySize = 50 * 1024 * 1024,
 | |
|         bool enableGrpc = true
 | |
|     )
 | |
|     {
 | |
|         builder.WebHost.ConfigureKestrel(options =>
 | |
|         {
 | |
|             options.Limits.MaxRequestBodySize = maxRequestBodySize;
 | |
| 
 | |
|             if (enableGrpc)
 | |
|             {
 | |
|                 // gRPC
 | |
|                 var grpcPort = int.Parse(configuration.GetValue("GRPC_PORT", "5001"));
 | |
|                 options.ListenAnyIP(grpcPort, listenOptions =>
 | |
|                 {
 | |
|                     listenOptions.Protocols = HttpProtocols.Http2;
 | |
| 
 | |
|                     var selfSignedCert = _CreateSelfSignedCertificate();
 | |
|                     listenOptions.UseHttps(selfSignedCert);
 | |
|                 });
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var httpPorts = configuration.GetValue("HTTP_PORTS", "6000")
 | |
|                 .Split(',', StringSplitOptions.RemoveEmptyEntries)
 | |
|                 .Select(p => int.Parse(p.Trim()))
 | |
|                 .ToArray();
 | |
| 
 | |
|             // Regular HTTP
 | |
|             foreach (var httpPort in httpPorts)
 | |
|                 options.ListenAnyIP(httpPort,
 | |
|                     listenOptions => { listenOptions.Protocols = HttpProtocols.Http1AndHttp2; });
 | |
|         });
 | |
| 
 | |
|         return builder;
 | |
|     }
 | |
| 
 | |
|     static X509Certificate2 _CreateSelfSignedCertificate()
 | |
|     {
 | |
|         using var rsa = RSA.Create(2048);
 | |
|         var certRequest = new CertificateRequest(
 | |
|             "CN=dyson.network", // Common Name for the certificate
 | |
|             rsa,
 | |
|             HashAlgorithmName.SHA256,
 | |
|             RSASignaturePadding.Pkcs1);
 | |
| 
 | |
|         // Add extensions (e.g., for server authentication)
 | |
|         certRequest.CertificateExtensions.Add(
 | |
|             new X509EnhancedKeyUsageExtension(
 | |
|                 new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, // Server Authentication
 | |
|                 false));
 | |
| 
 | |
|         // Set validity period (e.g., 1 year)
 | |
|         var notBefore = DateTimeOffset.UtcNow.AddDays(-1);
 | |
|         var notAfter = notBefore.AddYears(1);
 | |
| 
 | |
|         var certificate = certRequest.CreateSelfSigned(notBefore, notAfter);
 | |
| 
 | |
|         // Export to PKCS#12 and load using X509CertificateLoader
 | |
|         var pfxBytes = certificate.Export(X509ContentType.Pfx);
 | |
|         return X509CertificateLoader.LoadPkcs12(pfxBytes, password: null);
 | |
|     }
 | |
| }
 |