#c# #.net #ssl-certificate #x509certificate #x509certificate2
#c# #.net #ssl-сертификат #x509certificate #x509certificate2
Вопрос:
У меня есть конечная точка, которую мне нужно нажать и проверить.
У меня есть сгенерированный файл .p12 и цепочка сертификатов (корневых и промежуточных), которые я могу использовать для проверки.
Вот код, который я сейчас использую, который выдает мне эту ошибку:
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
var handler = new HttpClientHandler();
var p12 = new X509Certificate2(
Path.Combine(Environment.CurrentDirectory, "Assets/Certs/p12filename.p12"),
"TheRealPassword");
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(p12);
handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, chain, sslPolicyErrors) =>
{
var root = new X509Certificate2(
Path.Combine(Environment.CurrentDirectory, "Assets/Certs/Root.cer"));
X509Chain CertificateChain = chain;
CertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
return CertificateChain.Build( root );
};
var client = new HttpClient(handler);
var url = "https://urlHere"
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
var response = await client.SendAsync(request);
Я не очень хорошо разбираюсь в использовании сертификатов, так что, возможно, это что-то довольно элементарное. Следует отметить, что если внутри ServerCertificateCustomValidationCallback я возвращаю true
, у меня нет проблем.
Обновление: чтобы уточнить, как я могу проверить конечную точку, которую я нажимаю, используя мой .p12 и соответствующие корневые и промежуточные сертификаты. Мое предположение, основанное на возврате true при обратном вызове, дает мне то, что я хочу, это то, что мне нужно выполнить эти проверки здесь.
Комментарии:
1. В чем ваш вопрос? Кстати, логика внутри обратного вызова лежит в основе моего понимания, для меня это не имеет никакого смысла.
2. Это исключение означает, что вы возвращаетесь
false
из своего обратного вызова. Но код в вашем обратном вызове в настоящее время звучит так: «доверяет ли этот компьютер сертификату в каком-либо файле на диске»… он вообще не просматривает сертификат, который использовался в запросе, поэтому, если ваш компьютер действительно доверялroot.cer
, вы бы перешли от принятия nothing к принятию любого сертификата для любой конечной точки (таким образом, будучи открытым для атак man in the middle).3. @crypt32 Я обновил свой первоначальный пост
4. @bartonjs спасибо за это объяснение, которое теперь имеет больше смысла, это было что-то вроде объединения найденных мной сообщений, которые я, очевидно, не до конца понял. Я обновил свой первоначальный пост, объясняющий, чего я надеюсь достичь.
5. Вам нужно проверить, привязан ли сертификат сервера к корню, хранящемуся в вашем приложении? Правильно ли это?