Pierwsze Linux i MacOS pracować
Jeśli pracujesz w systemie Linux lub MacOS was mogą napotkać scenariusz, w którym HttpClient
nie pozwoli Ci uzyskać dostęp do własnej podpisał cert nawet jeśli jest w zaufanym sklepie . otrzymasz prawdopodobnie następujący:
System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates environment variable
od jeśli wykonawczych (jak pokazano w drugiej odpowiedzi)
handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) =>
{
// Log it, then use the same answer it would have had if we didn't make a callback.
Console.WriteLine(cert);
return errors == SslPolicyErrors.None;
};
Wynika to z wersji libcurl na maszynie nie wspierającego odpowiednie wywołania zwrotne że .Net Core musi w celu zebrania odpowiednich danych, aby zadzwonić na numer ServerCertificateCustomValidationCallback
. Na przykład, nie ma sposobu, aby struktura stworzyła obiekt cert
lub inny z parametrów. Więcej informacji można znaleźć w dyskusji na obejście tego problemu, który został przewidziany w .NET Rdzenia sporne w DotNet rdzenia github repo:
https://github.com/dotnet/corefx/issues/19709
Obejście (które powinny być wykorzystywane jedynie do testowania lub konkretnych zastosowań wewnętrznych) jest następujący:
using System;
using System.Net.Http;
using System.Runtime.InteropServices;
namespace netcurl
{
class Program
{
static void Main(string[] args)
{
var url = "https://localhost:5001/.well-known/openid-configuration";
var handler = new HttpClientHandler();
using (var httpClient = new HttpClient(handler))
{
// Only do this for testing and potentially on linux/mac machines
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) && IsTestUrl(url))
{
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
}
var output = httpClient.GetStringAsync(url).Result;
Console.WriteLine(output);
}
}
static bool IsTestUrl(string url) => url.Contains("localhost");
}
}
jest inna droga do rozwiązywania tego problemu, i że stosuje wersję libcurl, która jest skompilowany z obsługą openSSL.Dla MacOS, tutaj jest dobry tutorial jak zrobić to:
https://spin.atomicobject.com/2017/09/28/net-core-osx-libcurl-openssl/
dla krótkiej wersji, chwyć kopię najnowszej libcurl skompilowane ze wsparciem openssl:
brew install curl --with-openssl
Prawdopodobnie don nie chcesz zmusić całego systemu operacyjnego do używania wersji libcurl innej niż Apple, więc będziesz prawdopodobnie chciał użyć zmiennej środowiskowej DYLD_LIBRARY_PATH
zamiast używać brew, aby wymusić połączenie binariów z normalną ścieżką systemu operacyjnego.
export DYLD_LIBRARY_PATH=/usr/local/opt/curl/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}
Powyższe polecenie może być użyte do ustawienia odpowiedniej zmiennej środowiskowej po uruchomieniu dotnet
w terminalu. Nie dotyczy to jednak aplikacji GUI. Jeśli używasz Visual Studio for Mac, można ustawić zmienną środowiskową w ustawieniach projektu uruchomić:
Drugie podejście było konieczne dla mnie podczas korzystania IdentityServer4 i Token zezwolenia. Potok autoryzacji .NET Core 2.0 nawiązywał połączenie z urzędem tokenu przy użyciu instancji HttpClient
. Ponieważ nie miałem dostępu do obiektu HttpClient
lub jego obiektu HttpClientHandler
, musiałem wymusić instancję HttpClient
, aby użyć odpowiedniej wersji biblioteki libcurl, która zajmie moje korzenie systemu KeyChain dla mojego zaufanego certyfikatu. W przeciwnym razie uzyskałbym System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates environment variable
podczas próby zabezpieczenia punktu końcowego Webapi przy użyciu atrybutu Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]
.
Poświęciłem godziny na badanie tego przed znalezieniem pracy dookoła. Cały mój cel polegał na używaniu certyfikatu samopodpisanego podczas programowania dla macO za pomocą IdentityServer4 w celu zabezpieczenia mojego webapi. Mam nadzieję że to pomoże.
może to być pomocne http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors –
Prawdopodobny duplikat [pomija nieprawidłowy certyfikat SSL w rdzeniu .net] (http://stackoverflow.com/questions/38138952/bypass-invalid-ssl-certificate-in-net-core) – thmshd
Dzięki za wszystkie podpowiedzi do innych wątków - ale po odwiedzeniu ich wszystkich w przeszłości nadal mam problem - żaden z nich się nie skompiluje. Za każdym razem jest jakieś odniesienie, którego nie można znaleźć. Najwyraźniej brakuje tu czegoś oczywistego! Małe fragmenty nie dostarczają wystarczającej ilości informacji (jak dla mnie), jak to, co jeszcze należy uwzględnić lub z którym się odwołać. Ctrl-. nie przedstawia też żadnych rozsądnych sugestii. – DaveEP