From aa41bae9c3163c96b4c08434eeaa6f401d3feea6 Mon Sep 17 00:00:00 2001 From: Renato Golia Date: Wed, 20 Jan 2021 16:15:18 +0100 Subject: [PATCH] Add helper methods to customize SSL certificate validation (#2) --- .../Http/HttpClientBuilderExtensions.cs | 53 +++++++++++++++++++ .../Http/HttpClientBuilderExtensionsTests.cs | 18 +++++++ 2 files changed, 71 insertions(+) create mode 100644 src/Http/Http.Configuration/Http/HttpClientBuilderExtensions.cs create mode 100644 tests/Tests.Http.Configuration/Http/HttpClientBuilderExtensionsTests.cs diff --git a/src/Http/Http.Configuration/Http/HttpClientBuilderExtensions.cs b/src/Http/Http.Configuration/Http/HttpClientBuilderExtensions.cs new file mode 100644 index 0000000..3efcb56 --- /dev/null +++ b/src/Http/Http.Configuration/Http/HttpClientBuilderExtensions.cs @@ -0,0 +1,53 @@ +// ReSharper disable CheckNamespace + +using System; +using System.Net.Http; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.Extensions.Http +{ + /// + /// A set of extension methods for . + /// + public static class HttpClientBuilderExtensions + { +#if NET5_0 || NETSTANDARD + /// + /// Configures the primary HTTP message handler to validate SSL certificates using the specified . + /// + /// The instance of to extend. + /// The callback to be used to validate SSL certificates. + /// The same instance of passed in . + /// cannot be null. + /// cannot be null. + public static IHttpClientBuilder ConfigureSslCertificateValidation(this IHttpClientBuilder builder, Func callback) + { + _ = builder ?? throw new ArgumentNullException(nameof(builder)); + + _ = callback ?? throw new ArgumentNullException(nameof(callback)); + + _ = builder.ConfigurePrimaryHttpMessageHandler(() => + { + var handler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = callback, + }; + + return handler; + }); + + return builder; + } + + /// + /// Configures the primary HTTP message handler to always accept incoming SSL certificates. + /// + /// The instance of to extend. + /// The same instance of passed in . + /// cannot be null. + public static IHttpClientBuilder DisableSslCertificateValidation(this IHttpClientBuilder builder) => ConfigureSslCertificateValidation(builder, (_, _, _, _) => true); +#endif + } +} diff --git a/tests/Tests.Http.Configuration/Http/HttpClientBuilderExtensionsTests.cs b/tests/Tests.Http.Configuration/Http/HttpClientBuilderExtensionsTests.cs new file mode 100644 index 0000000..a98315c --- /dev/null +++ b/tests/Tests.Http.Configuration/Http/HttpClientBuilderExtensionsTests.cs @@ -0,0 +1,18 @@ +using AutoFixture.Idioms; +using Microsoft.Extensions.Http; +using NUnit.Framework; + +namespace Tests.Http +{ + [TestFixture] + public class HttpClientBuilderExtensionsTests + { +#if NET5_0 || NETCOREAPP + [Test, CustomAutoData] + public void ConfigureSslCertificateValidation_does_not_accept_null_parameters(GuardClauseAssertion assertion) => assertion.Verify(typeof(HttpClientBuilderExtensions).GetMethod(nameof(HttpClientBuilderExtensions.ConfigureSslCertificateValidation))); + + [Test, CustomAutoData] + public void DisableSslCertificateValidation_does_not_accept_null_parameters(GuardClauseAssertion assertion) => assertion.Verify(typeof(HttpClientBuilderExtensions).GetMethod(nameof(HttpClientBuilderExtensions.DisableSslCertificateValidation))); +#endif + } +}