Skip to content

Commit e041390

Browse files
authored
Minimal changes to support certificate chain-preloading at startup (#24934)
1 parent fec96f2 commit e041390

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ public SniOptionsSelector(
6868
}
6969
}
7070

71+
if (sslOptions.ServerCertificate != null)
72+
{
73+
// This might be do blocking IO but it'll resolve the certificate chain up front before any connections are
74+
// made to the server
75+
sslOptions.ServerCertificateContext = SslStreamCertificateContext.Create((X509Certificate2)sslOptions.ServerCertificate, additionalCertificates: null);
76+
}
77+
7178
if (!certifcateConfigLoader.IsTestMock && sslOptions.ServerCertificate is X509Certificate2 cert2)
7279
{
7380
HttpsConnectionMiddleware.EnsureCertificateIsAllowedForServerAuth(cert2);

src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ internal class HttpsConnectionMiddleware
3939

4040
// The following fields are only set by HttpsConnectionAdapterOptions ctor.
4141
private readonly HttpsConnectionAdapterOptions _options;
42+
private readonly SslStreamCertificateContext _serverCertificateContext;
4243
private readonly X509Certificate2 _serverCertificate;
4344
private readonly Func<ConnectionContext, string, X509Certificate2> _serverCertificateSelector;
4445

@@ -89,6 +90,10 @@ public HttpsConnectionMiddleware(ConnectionDelegate next, HttpsConnectionAdapter
8990
else
9091
{
9192
EnsureCertificateIsAllowedForServerAuth(_serverCertificate);
93+
94+
// This might be do blocking IO but it'll resolve the certificate chain up front before any connections are
95+
// made to the server
96+
_serverCertificateContext = SslStreamCertificateContext.Create(_serverCertificate, additionalCertificates: null);
9297
}
9398

9499
var remoteCertificateValidationCallback = _options.ClientCertificateMode == ClientCertificateMode.NoCertificate ?
@@ -232,6 +237,7 @@ private Task DoOptionsBasedHandshakeAsync(ConnectionContext context, SslStream s
232237
var sslOptions = new SslServerAuthenticationOptions
233238
{
234239
ServerCertificate = _serverCertificate,
240+
ServerCertificateContext = _serverCertificateContext,
235241
ServerCertificateSelectionCallback = selector,
236242
ClientCertificateRequired = _options.ClientCertificateMode != ClientCertificateMode.NoCertificate,
237243
EnabledSslProtocols = _options.SslProtocols,

src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,9 @@ public void FallsBackToHttpsConnectionAdapterCertificate()
385385
{
386386
{ "www.example.org", new SniConfig() }
387387
};
388-
389388
var fallbackOptions = new HttpsConnectionAdapterOptions
390389
{
391-
ServerCertificate = new X509Certificate2()
390+
ServerCertificate = new X509Certificate2(TestResources.GetCertPath("aspnetdevcert.pfx"), "testPassword")
392391
};
393392

394393
var sniOptionsSelector = new SniOptionsSelector(
@@ -761,7 +760,7 @@ public X509Certificate2 LoadCertificate(CertificateConfig certInfo, string endpo
761760
return null;
762761
}
763762

764-
var cert = new X509Certificate2();
763+
var cert = TestResources.GetTestCertificate();
765764
CertToPathDictionary.Add(cert, certInfo.Path);
766765
return cert;
767766
}

0 commit comments

Comments
 (0)