我有一个简单的控制台应用程序(.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 证书来验证服务器证书?
由于我有 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);
}