HttpClient を使って HTTPS サイトの証明書を取得

HttpClientHandler の ServerCertificateCustomValidationCallback にセットしたコールバック内で、証明書と証明書チェインを取り出すことができた。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

namespace CertificateSample
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var certificates = new List<X509Certificate2>();
            var handler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (request, cert, chain, errors) =>
                {
                    // 証明書と証明書チェインを複製
                    foreach (var chainElement in chain.ChainElements)
                    {
                        certificates.Add(new X509Certificate2(chainElement.Certificate.RawData));
                    }
                    certificates.Add(new X509Certificate2(cert.RawData));
                    return true;
                },
            };
            var client = new HttpClient(handler);
            await client.GetAsync("https://tnakamura.hatenablog.com");

            foreach (var certificate in certificates)
            {
                Console.WriteLine($"サブジェクト: {certificate.Subject}");
                Console.WriteLine($"発行元: {certificate.Issuer}");
                Console.WriteLine($"有効期間開始時刻: {certificate.NotBefore}");
                Console.WriteLine($"有効期間終了時刻: {certificate.NotAfter}");
                foreach (var extension in certificate.Extensions)
                {
                    Console.Write($"{extension.Oid.FriendlyName}:");
                    Console.WriteLine(extension.Format(true));
                }
            }
            Console.WriteLine("Enter で終了");
            Console.ReadLine();
        }
    }
}