如何确定与 Web 服务器的连接是否正在使用完全向前保密

本文关键字:保密 Web 何确定 服务器 是否 连接 | 更新日期: 2023-09-27 18:36:07

我有一个连接到Web服务器的C#程序并显示SSL证书的到期日期。

我想知道的是如何确定连接是否正在使用完全前向保密 [PFS]?

using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;
            ServicePointManager.CheckCertificateRevocationList = true;
            var request = WebRequest.Create("https://www.microsoft.com/");
            var response = request.GetResponse();
            Console.WriteLine("Done.");
            Console.ReadLine();
        }
        private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            Console.WriteLine("Certificate expires on " + certificate.GetExpirationDateString());
            return true;
        }
    }
}

如何确定与 Web 服务器的连接是否正在使用完全向前保密

前言:我不是密码学家。

根据此信息安全答案,您需要查看商定的密码套件,即套件的密钥交换部分。据此,任何基于Diffie-Hellman的东西都提供了完美的前向保密性。正如埃里克森在评论中指出的那样,这可能是不真实的,你会想要了解假设完全前向保密存在的安全复杂性,而实际上它不存在。

有了这个,你正在寻找SslStream.这将允许您访问所需的密钥交换属性。

这并不像使用WebRequest甚至HttpRequest那么容易。您将不得不自己写出连接。示例如下所示:

string host = "www.microsoft.com";
using (var client = new TcpClient(host, 443))
using (var stream = client.GetStream())
using (var sslStream = new SslStream(stream))
{
    sslStream.AuthenticateAsClient(host);
    // figure out if sslStream.KeyExchangeAlgorithm support PFS here
}

理论上,KeyExchangeAlgorithm是一个枚举。你可以做if(sslStream.KeyExchangeAlgorithm == ExchangeAlgorithmType.DiffieHellman),你会知道答案[1]。但根据这个Microsoft论坛帖子,ExchangeAlgorithmType可能是44550,相当于椭圆曲线Diffie-Hellman。椭圆曲线 Diffie-Hellman 确实支持完全前向保密。

如果要修改当前代码以使所有这些在一个连接中发生,可以在sslStream.RemoteCertificate上获得远程证书,以便获取证书到期日期。

[1] 并非所有的迪菲-赫尔曼交易所都支持完全前向保密。同样,请考虑其安全复杂性。