certChain.ChainStatus and ChainElementStatus is empty or null in custom cert chain validation .net 6

239 views Asked by At

we need to do a custom cert chain validation, got the code from one of the forums but in the call back certChain.ChainStatus and ChainElementStatus are empty or null. its not validating anything where chain status is there, its just skipping. Anybody has any pointers on this issue, are we missing anything

enter image description here var root = new X509Certificate2(@"c:\root.cer"); var inter = new X509Certificate2(@"inter.cer"); var validCertificates = new[] { root, inter };

   var handler = new HttpClientHandler();
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, certChain, policyErrors) =>
        {
            return ValidateCertificate(httpRequestMessage, cert, certChain, policyErrors, validCertificates);
        };



        var httpClient = new HttpClient(handler);
 
 
 
 private bool ValidateCertificate(HttpRequestMessage httpRequestMessage, X509Certificate2 cert,
       X509Chain certChain, SslPolicyErrors policyErrors, X509Certificate2[] validCertificates)
    {
        if (certChain.ChainStatus.Any(status => status.Status != X509ChainStatusFlags.UntrustedRoot))
            return false;

        foreach (var element in certChain.ChainElements)
        {
            foreach (var status in element.ChainElementStatus)    ---skipping this step and not getting inside
            {
                if (status.Status == X509ChainStatusFlags.UntrustedRoot)
                {
                   certificates
                    if (validCertificates.Any(cert => cert.RawData.SequenceEqual(element.Certificate.RawData)))
                        continue; 
                }

                return false;
            }
        }
        return true;
    }
1

There are 1 answers

1
bartonjs On

Those arrays are empty when the element (or overall chain, depending on which one) have no errors.

You're showing a state that is appropriate to a trusted chain.