代码之家  ›  专栏  ›  技术社区  ›  Fernando Urkijo

C#通用应用程序平台中证书的公钥

  •  2
  • Fernando Urkijo  · 技术社区  · 9 年前

    https://blogs.windows.com/buildingapps/2015/10/13/create-more-secure-apps-with-less-effort-10-by-10/ 他们向您解释如何安全地连接到服务器。他们检查指纹,看证书是否合法。但是证书会随着时间的推移而改变,我检查的硬编码字符串将不再有效。

    这就是为什么我要提取公钥。因为我确信它不会从一个证书变成另一个证书。

    在此代码中:

            private async Task DemoSSLRoot()
        {
            // Send a get request to Bing
            HttpClient client = new HttpClient();
            Uri bingUri = new Uri("https://www.bing.com");
            HttpResponseMessage response = await client.GetAsync(bingUri);
    
            // Get the list of certificates that were used to validate the server's identity
            IReadOnlyList<Certificate> serverCertificates = response.RequestMessage.TransportInformation.ServerIntermediateCertificates;
    
            // Perform validation
            if (!ValidCertificates(serverCertificates))
            {
                // Close connection as chain is not valid
                return;
            }
    
            PrintResults("Validation passed\n");
            // Validation passed, continue with connection to service
        }
    
        private bool ValidCertificates(IReadOnlyList<Certificate> certs)
        {
            // In this example, we iterate through the certificates and check that the chain contains
            // one specific certificate we are expecting
            for (int i = 0; i < certs.Count; i++)
            {
                PrintResults("Cert# " + i + ": " + certs[i].Subject + "\n");
                byte[] thumbprint = certs[i].GetHashValue();
    
                // Check if the thumbprint matches whatever you are expecting
                // ‎d4 de 20 d0 5e 66 fc 53 fe 1a 50 88 2c 78 db 28 52 ca e4 74
                byte[] expected = new byte[] { 212, 222, 32, 208, 94, 102, 252, 83, 254, 26, 80, 136, 44, 120, 219, 40, 82, 202, 228, 116 };
    
                if (ThumbprintMatches(thumbprint, expected))
                {
                    return true;
                }
            }
    
            return false;
        }
    

    更多信息请访问 https://blogs.windows.com/buildingapps/2015/10/13/create-more-secure-apps-with-less-effort-10-by-10/#1tFDZeMtskOkOrvd.99

    很容易访问指纹。但我需要公钥。 我在互联网上搜索,发现了非常疯狂的代码,以检查我是否无法使其工作。

    当做

    2 回复  |  直到 9 年前
        1
  •  1
  •   TomáÅ¡ Kratochvíla    9 年前

    X509证书。GetPublicKey方法可用于Universal Windows Platform。

    例如,您可以使用:

    var publicKey = certs[i].GetPublicKey();
    

    byte[] publicKey = certs[i].GetPublicKey.EncodedKeyValue.RawData;
    
        2
  •  1
  •   Fernando Urkijo    9 年前

    正如Tomas所说,有一种方法叫做GetPublicKey。它不包含在API中。刚刚注意到有一个名为“System.Security.Cryptography.X509Certificates”的nuget包,其中提供了此方法。

    谢谢