2012-09-15 54 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; 
} 
相關問題