【问题标题】:How can I determine if a connection to a webserver is using Perfect Forward Secrecy?如何确定与网络服务器的连接是否使用完美前向保密?
【发布时间】:2015-02-28 17:49:58
【问题描述】:

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

我想知道的是如何确定连接是否正在使用Perfect Forward Secrecy [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;
        }
    }
}

【问题讨论】:

    标签: c# ssl https


    【解决方案1】:

    前言:我不是密码学家。

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

    这样,您正在寻找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]。但是根据this Microsoft Forum postExchangeAlgorithmType可能是44550,相当于椭圆曲线Diffie-Hellman。椭圆曲线 Diffie-Hellman 确实支持完美前向保密。

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

    [1] 可能并非所有 Diffie-Hellman 交换都支持完美前向保密。再次考虑一下这带来的安全问题。

    【讨论】:

    • 我必须阅读,但我相信有些 DH 模式提供 PFS。我认为您需要更具体地寻找 临时 DH 密钥协议(EDH_XXX 密码套件)。
    • 寻找 DHE (EDH; Diffie-Hellman ephemeral) 和 ECDHE (EECDH; Elliptic curve Diffie-Hellman ephemeral)。只有这些密钥协商算法提供 PFS。 DH、ECDH 和 RSA 没有。
    • 史蒂文,我的理解是否正确,您是说如果使用 WebRequest.Create 创建连接,则无法确定正在使用哪种加密方式?
    • @zakjan MSDN 说“DiffieHellman - Diffie Hellman 临时密钥交换算法”。因为,它特别说是短暂的,我想假设它是短暂的是安全的。此外,根据微软论坛帖子,44550 = ECDH Ephemeral。
    猜你喜欢
    • 2019-05-27
    • 2022-08-16
    • 2017-05-05
    • 1970-01-01
    • 2012-12-11
    • 2019-02-20
    • 2022-07-12
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多