2012-09-15 50 views
5

我已经创建了我的自签名的证书,并将其安装到我的客户的信任的根,用于.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; 
    } 

所以可能有人创建一个假certification.pfx和其关联到他的假服务器和我的客户端连接到他的假服务器?

回答

4

的SSL证书的通用名称(CN)字段应该是你试图连接到主机的DNS名称。你是“信任”的“可信根证书Authorites”,他们不会没有验证的CN上市DNS名称的所有权问题,以CN证书。

您已经通过手动添加证书颁发机构(CA)的信任列表绕过这一点。因此,计算机信任您的个人CA,即从服务器收到的证书有权用于证书上列出的任何CN。

一个攻击者不能做一个“假”证书的CA颁发谁擅自证书不在“信任”,因此验证失败。


这是合作代理经常工作的方式。 IT部门在工作站上安装CA.当您不用通过代理,一个SSL请求时,回复回来的代理截获“CN=*.google.com签名威瑞信”,发送到您的工作站“CN=*.google.com,由XYZ Corperate代理人签字”。因为IT 预装受信任的根CA浏览器不会抱怨。

但是,如果您使用某些不使用正常存储的浏览器,或者没有安装CA,则您的计算机将看到“由XYZ Coperate代理签名”证书,但不知道该CA的身份是,然后返回RemoteCertificateChainErrorssslPolicyErrors的论点。


检查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; 
       } 
      } 
     } 
    } 
} 
+0

是的,他能,*他的机器上只* 。这不会是一个“主要在中东”,攻击者控制一个端点,对此你可以做的事情不多。你可以把在证书的指纹,但一个更聪明的想法是把CA的指纹和检查,这样你可以发布新的证书(说你需要改变你要连接的DNS名称,你会需要一个新的证书并为此颁发新的证书指纹)。我将添加一些快速代码来演示如何。 –

+0

因此,Ssl只是为了保护我的客户端服务器免受MITM攻击,而不是控制客户端的EndPoint? –

+0

保护端点是可行的。如果最终用户可以运行任意代码,那么你已经丢失了。攻击者所要做的就是附加他自己的调试器,他们可以在正在运行的程序中做任何他们想做的事情。你可以让它变得很难,但是你无法阻止它。 “阻止它”的唯一方法是不允许最终用户运行他们想要的任何东西。一个例子是** un-jailbroken ** iPhone,用户只能从应用程序商店运行应用程序,而商店没有调试工具,因此最终用户无法攻击该程序。但如果越狱...你是你开始的地方,无法阻止它。 –

1

如果你要使用自签名的证书,您需要使用您以其他方式呈现它的代码是不够的,只是使用

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

    } 
    return false; 
} 
相关问题