获取CA证书,用于检查服务器证书

问题描述 投票:0回答:1

我有一个简单的控制台应用程序(.NET / C#),它正在创建 TLS 连接。连接正常,我可以向服务器发送

ping
,服务器将回复
pong
。发送和接收的代码被省略,最小的例子是这个。

internal class Program
{
    static void Main(string[] args)
    {
        string server = "172.16.62.21";
        TcpClient client = new TcpClient(server, 8081);

        using (SslStream sslStream = new SslStream(client.GetStream(), false,
            new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
        {
            sslStream.AuthenticateAsClient(server);

            // Sending ping here 
            // Reading pong reply here

            Console.WriteLine("waiting for keypress");
            Console.ReadKey();
        }

        client.Close();
    }

    public static bool ValidateServerCertificate(object sender, X509Certificate? certificate,
    X509Chain? chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
}

由于我有 TLS 连接(已使用 Wireshark 验证),并且由于此示例有效,因此我假设我有安全连接。

有什么方法可以检查客户端(此程序)使用哪个 CA 证书来验证服务器证书?

c# ssl x509
1个回答
1
投票

由于我有 TLS 连接(已使用 Wireshark 验证),并且由于此示例有效,因此我假设我有安全连接。

嗯,它的安全性仅在于它是加密的。但加密依赖于您接受任何证书,甚至是自签名或不受信任的 CA,因此任何人都可以 MITM。

有什么方法可以检查客户端(此程序)使用哪个 CA 证书来验证服务器证书?

没有根证书,因为您尚未验证任何内容。你刚刚离开

return true
所以无论如何都要接受它。

如果您正确验证它,

X509Chain
将为您提供根证书。

public static bool ValidateServerCertificate(object sender, X509Certificate? certificate,
    X509Chain? chain, SslPolicyErrors sslPolicyErrors)
{
    chain.Build(certificate);
    var lastChainElement = chain.ChainElements.Last();

    Console.WriteLine(lastChainElement.Certificate.ToString())

    return
        sslPolicyErrors == 0 &&
        lastChainElement.ChainElementStatus.Any(status => status == X509ChainStatusFlags.NoError);
}
© www.soinside.com 2019 - 2024. All rights reserved.