Проверка конечной точки с помощью .p12

#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. Вам нужно проверить, привязан ли сертификат сервера к корню, хранящемуся в вашем приложении? Правильно ли это?