Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任何人都有可能伪造认证吗?_C#_Ssl_Certificate - Fatal编程技术网

C# 任何人都有可能伪造认证吗?

C# 任何人都有可能伪造认证吗?,c#,ssl,certificate,C#,Ssl,Certificate,我已经创建了我的自签名证书,并将其安装到客户端的受信任根目录,并使用.pfx[服务器端]来确认证书和身份验证正在顺利进行,没有任何错误 但有一个问题让我很困惑,黑客有没有办法伪造我客户的身份验证?用他的假证书和服务器 例如: 我验证证书的代码是 private static bool OnCertificateValidation( object sender, X509Certificate certificate, X509Chain

我已经创建了我的自签名证书,并将其安装到客户端的受信任根目录,并使用.pfx[服务器端]来确认证书和身份验证正在顺利进行,没有任何错误

但有一个问题让我很困惑,黑客有没有办法伪造我客户的身份验证?用他的假证书和服务器

例如:

我验证证书的代码是

    private static bool OnCertificateValidation(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            if (CaVerify(chain) && ServerVerify(certificate)) return true;
        }
        return false;
    }

    public static bool CaVerify(X509Chain chain)
    {
        if (chain.ChainElements.Count > 0)
        {
            var certHash = chain.ChainElements[chain.ChainElements.Count - 1].Certificate.GetCertHash();
            if (certHash.Length == ApiCertHash.Length)
            {
                for (var idx = 0; idx < certHash.Length; idx++)
                {
                    if (certHash[idx] == ApiCertHash[idx])
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static bool ServerVerify(X509Certificate certificate)
    {
        var certHash = certificate.GetCertHash();

        if (certHash.Length == ApiCertHash.Length)
        {
            for (var idx = 0; idx < certHash.Length; idx++)
            {
                if (certHash[idx] == ApiCertHash[idx])
                {
                    return true;
                }
            }

        }
        return false;
    }
私有静态bool OnCertificateValidation(
对象发送器,
X509证书,
X509链条,
SslPolicyErrors SslPolicyErrors)
{
如果(sslPolicyErrors==sslPolicyErrors.None)
{
if(CaVerify(chain)和&ServerVerify(certificate))返回true;
}
返回false;
}
公共静态bool CaVerify(X509Chain)
{
如果(chain.chainements.Count>0)
{
var certHash=chain.ChainElements[chain.ChainElements.Count-1]。Certificate.GetCertHash();
if(certHash.Length==ApiCertHash.Length)
{
for(var idx=0;idx
因此,是否有人可以创建一个假certification.pfx并将其与他的假服务器关联,并将我的客户端连接到他的假服务器?

SSL证书的公共名称(CN)字段应该是您尝试连接的主机的DNS名称。您“信任”了“受信任的根证书颁发者”,即如果不验证CN中列出的DNS名称的所有权,他们将不会颁发带有CN的证书

通过手动将证书颁发机构(CA)添加到受信任列表,您绕过了此问题。因此,计算机信任您的个人CA,它从服务器收到的证书被授权用于证书上列出的任何CN

攻击者无法生成“假”证书,因为颁发未经授权证书的CA不“受信任”,因此验证失败


这就是coperate代理通常的工作方式。IT部门在工作站上安装CA。当您发出SSL请求时,它会通过代理,当回复返回时,代理会截取“
CN=*.google.com
由VeriSign签名”并发送到您的工作站“
CN=*.google.com
,由XYZ Coroperate proxy签名”。由于IT预装了受信任的根CA,浏览器不会抱怨

但是,如果您使用的浏览器不使用普通存储,或者没有安装CA,则会出现证书错误,因为您的计算机会看到“由XYZ Coperate代理签名”证书,不知道该CA是谁,然后返回
sslPolicyErrors
参数


检查CA哈希的代码示例

if (sslPolicyErrors == SslPolicyErrors.None)
{
    var apiCertHash = new byte[] { 0x79, 0x04, 0x15, 0xC5, 0xC4, 0xF1, 0x6A, 0xA7, 0xC9, 0x12, 0xBB, 0x23, 0xED, 0x5A, 0x60, 0xA7, 0x92, 0xA8, 0xD5, 0x94 };
    if(chain.ChainElements.Count > 0)
    {
        //Not 100% if the root is first or last in the array. Don't have the program running to check.
        var certHash = chain.ChainElements[chain.ChainElements.Count - 1].Certificate.GetCertHash();
        if (certHash.Length == apiCertHash.Length)
        {
            for (var idx = 0; idx < certHash.Length; idx++)
            {
                if (certHash[idx] == apiCertHash[idx])
                {
                    return true;
                }
            }
        }
    }
}
if(sslPolicyErrors==sslPolicyErrors.None)
{
var apiCertHash=新字节[]{0x79、0x04、0x15、0xC5、0xC4、0xF1、0x6A、0xA7、0xC9、0x12、0xBB、0x23、0xED、0x5A、0x60、0xA7、0x92、0xA8、0xD5、0x94};
如果(chain.chainements.Count>0)
{
//如果根是数组中的第一个或最后一个,则不是100%。请不要运行程序进行检查。
var certHash=chain.ChainElements[chain.ChainElements.Count-1]。Certificate.GetCertHash();
if(certHash.Length==apiCertHash.Length)
{
for(var idx=0;idx
如果要使用自签名证书,则需要使用您提供的代码,否则只需使用即可

private static bool OnCertificateValidation(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;

    }
    return false;
}

是的,他只能在他的机器上。这将不是一个“中间的主”,攻击者控制一个端点,对此你无能为力。您可以输入证书的指纹,但更聪明的方法是输入CA的指纹并检查,这样您就可以颁发新证书(例如,您需要更改连接到的DNS名称,您需要一个新证书,因此需要一个新证书指纹)。我将添加一些快速代码来演示如何使用Ssl。因此Ssl只是为了保护我的客户端服务器免受MITM攻击,而不是控制客户端的端点?保护端点是不可能的。如果最终用户可以运行任意代码,则您已丢失。攻击者只需附加自己的调试器,就可以对正在运行的程序执行任何操作。你可以对他们施加压力,但你无法阻止。“阻止它”的唯一方法是不允许最终用户运行他们想要的任何东西。例如,未越狱的iPhone,用户只能从应用商店运行应用程序,商店没有调试工具,因此最终用户无法攻击该程序。但是如果越狱。。。你是从哪里开始的,无法停止。我正在使用根CA的哈希,而你正在使用连接到的服务器的哈希。是的,指纹是作为协商过程的一部分提交给客户机的公共证书的一部分,它不是秘密。只要CA的哈希不变,是的。这就是为什么当你“自签名”时,最好是自签名CA,然后让该CA签名服务器上的证书。也请删除一些t