Как разрешить Kestrel принимать самозаверяющие сертификаты с помощью встроенной. Net Core OAuth-авторизации? - PullRequest
1 голос
/ 22 февраля 2020

В настоящее время я занимаюсь разработкой веб-приложения, которое требует извлечения данных из системы IDM, которая в среде разработки использует самоподписанный сертификат (я не знаю причину). Он использует OAuth в качестве метода авторизации, поэтому в настоящее время я использую. Net Core 3.1 OAuth-библиотеки, которые выдают исключение SSL после успешного перенаправления из IDM. Мне дали самоподписанный сертификат (файл PFX) от IDM, но я не знаю, где его добавить.

public void ConfigureServices(IServiceCollection services)
{
    //services.Configure<KestrelServerOptions>(pConfiguration.GetSection("Kestrel"));
    services.AddControllers();
    services.AddControllersWithViews();
    services
        .AddAuthentication(authenticationOptions => {
            authenticationOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            authenticationOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            authenticationOptions.DefaultChallengeScheme = "the_scheme_challenge";
        })
        .AddCookie()
        .AddOAuth(authenticationScheme: "the_scheme", configureOptions: oauthOptions => {
            oauthOptions.ClientId = pConfiguration["the_scheme:ClientId"];
            oauthOptions.ClientSecret = pConfiguration["the_scheme:ClientSecret"];
            oauthOptions.CallbackPath = new PathString(pConfiguration["the_scheme:CallbackURL"]);
            oauthOptions.AuthorizationEndpoint = "https://the.idm.dev/idm/oauth/authorize";
            oauthOptions.TokenEndpoint = "https://the.idm.dev/idm/oauth/token";
            oauthOptions.UserInformationEndpoint = "https://the.idm.dev/idm/oauth/userinfo";
            oauthOptions.Scope.Add(pConfiguration["the_scheme:Scope"]);
            oauthOptions.SaveTokens = true;
        });
}

Любой совет будет принят, я не хочу писать все HTTP-запросы и Logi c с нуля с некоторым небезопасным кодом (например, разрешение на принятие любого сертификата).

Я проверил код с другими поставщиками OpenID, и он работал.

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Для. Net Ядро вы должны обнаружить, что доверие SSL наследуется от хранилища доверия операционной системы по умолчанию. Обычно это будет Windows хранилище сертификатов или Ma c OS Key Chain.

Мой Developer SSL Trust У записи есть некоторые замечания по этому поводу, так как:

  • Для технологии OAuth может быть свойственно использование самозаверяющих сертификатов для разработчика. P C
  • Конфигурирование доверительных отношений в разных технологиях весьма различается
  • Мы хотим создать продуктивную установку без написания небезопасного кода, как вы говорите
0 голосов
/ 24 февраля 2020

Мне нравится ответ Гэри, установка сертификатов кажется лучшим вариантом.

Но, я полагаю, вы можете использовать BackchannelHttpHandler, чтобы установить собственную проверку сертификата.

       .AddOAuth(authenticationScheme: "the_scheme", configureOptions: oauthOptions => {
                    oauthOptions.ClientId = pConfiguration["the_scheme:ClientId"];
                    oauthOptions.ClientSecret = pConfiguration["the_scheme:ClientSecret"];
                    oauthOptions.CallbackPath = new PathString(pConfiguration["the_scheme:CallbackURL"]);
                    oauthOptions.AuthorizationEndpoint = "https://the.idm.dev/idm/oauth/authorize";
                    oauthOptions.TokenEndpoint = "https://the.idm.dev/idm/oauth/token";
                    oauthOptions.UserInformationEndpoint = "https://the.idm.dev/idm/oauth/userinfo";
                    oauthOptions.Scope.Add(pConfiguration["the_scheme:Scope"]);
                    oauthOptions.SaveTokens = true;

                    //Handle the certificate checks yourself, 
                    oauthOptions.BackchannelHttpHandler = new HttpClientHandler()
                        {
                            ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => {
                                if (cert.Thumbprint == Configuration["TrustedCertificateThumbprint"])
                                {
                                    return true;
                                }

                            }
                        };

                    });
                });  

Это похоже к другим примерам, которые вы, возможно, уже видели, но вместо того, чтобы просто возвращать true, вы можете добавить свои собственные проверки, такие как отпечаток сертификата или, возможно, орган подписи.

Если у вас есть контроль над сервером ID, вы также можете получить сертификат с доверенным root, откуда-то вроде letsencrypt

0 голосов
/ 22 февраля 2020

Пожалуйста, проверьте этот фрагмент кода, взятый из взятых из Разработка локально с HTTPS, самоподписанными сертификатами и ASP. NET Core

public class Program
{
    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddEnvironmentVariables()
            .AddJsonFile("certificate.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"certificate.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true)
            .Build();

        var certificateSettings = config.GetSection("certificateSettings");
        string certificateFileName = certificateSettings.GetValue<string>("filename");
        string certificatePassword = certificateSettings.GetValue<string>("password");

        var certificate = new X509Certificate2(certificateFileName, certificatePassword);

        var host = new WebHostBuilder()
            .UseKestrel(
                options =>
                {
                    options.AddServerHeader = false;
                    options.Listen(IPAddress.Loopback, 44321, listenOptions =>
                    {
                        listenOptions.UseHttps(certificate);
                    });
                }
            )
            .UseConfiguration(config)
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseUrls("https://localhost:44321")
            .Build();

        host.Run();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...