1using System.Security.Cryptography;
2using System.Security.Cryptography.X509Certificates;
3
4using X509Certificate2 cert = X509CertificateLoader.LoadCertificateFromFile("cert.pem"); // PEM or DER
5
6// PublicKey works for every algorithm; ExportSubjectPublicKeyInfo returns the SPKI DER
7byte[] spki = cert.PublicKey.ExportSubjectPublicKeyInfo();
8string pem = new string(PemEncoding.Write("PUBLIC KEY", spki)) + "\n";
9Console.Write(pem);
10
11byte[] digest = SHA256.HashData(spki);
12Console.WriteLine($"SPKI SHA-256: {Convert.ToHexStringLower(digest)}");
13Console.WriteLine($"SPKI pin (base64): {Convert.ToBase64String(digest)}");
14
15// Typed access when you know the algorithm: null for other key types
16using ECDsa? ecdsa = cert.GetECDsaPublicKey();
17Console.WriteLine($"same as GetECDsaPublicKey(): {ecdsa!.ExportSubjectPublicKeyInfoPem() + "\n" == pem}");
18
19// Does key.pem belong to this certificate? CopyWithPrivateKey refuses a key that does not match.
20using ECDsa privateKey = ECDsa.Create();
21privateKey.ImportFromPem(File.ReadAllText("key.pem"));
22using X509Certificate2 withKey = cert.CopyWithPrivateKey(privateKey);
23Console.WriteLine($"key.pem matches: {withKey.HasPrivateKey}");
24