2012-09-15 49 views
5

Tôi đã tạo ra tự ký cấp giấy chứng nhận của tôi và cài đặt nó vào thư mục gốc Trusted khách hàng của tôi và sử dụng để .PFX [server side] để xác nhận chứng nhận đó và xác thực đang diễn ra suôn sẻ mà không cần bất kỳ lỗi nàoCó ai có thể tạo chứng nhận giả không?

Nhưng có một câu hỏi mà thực sự nhầm lẫn với tôi là có bất kỳ cách nào cho một hacker giả mạo xác thực với khách hàng của tôi? với cert và server giả của anh ta?

Ví dụ:

Mã của tôi để xác nhận việc xác nhận là

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; 
    } 

Vì vậy, có thể một số một tạo ra một certification.pfx giả và kết hợp nó vào máy chủ giả mạo của mình và kết nối khách hàng của tôi đến máy chủ giả của mình?

Trả lời

4

Các Common Name (CN) lĩnh vực chứng chỉ SSL nên là tên DNS của máy chủ bạn đang đang cố gắng để kết nối. Bạn đang "Đáng tin cậy" the "Trusted Root Certificate Authorites" rằng họ sẽ không cấp giấy chứng nhận với một CN mà không cần xác nhận quyền sở hữu tên DNS được liệt kê trong CN.

Bạn đã bỏ qua điều này bằng tay bằng cách thêm một Certificate Authority (CA) vào danh sách Trusted. Vì vậy, máy tính tin tưởng CA cá nhân của bạn rằng chứng chỉ mà nó nhận được từ máy chủ được phép sử dụng cho bất kỳ CN nào được liệt kê trên chứng chỉ.

Một kẻ tấn công không thể thực hiện một "Fake" giấy chứng nhận là CA, người cấp giấy chứng nhận trái phép không phải là "đáng tin cậy" để xác nhận thất bại.


Đây là cách proxy đồng bộ thường hoạt động. Bộ phận CNTT cài đặt một CA trên các máy trạm. Khi bạn thực hiện một yêu cầu SSL nó đi qua proxy, khi trả lời đến phía sau chặn proxy "CN=*.google.com Signed bởi VeriSign" và gửi đến máy trạm của bạn "CN=*.google.com, Signed bởi XYZ corperate Proxy". Vì IT được cài đặt sẵn Trusted Root CA, trình duyệt không phàn nàn.

Tuy nhiên nếu bạn sử dụng một số trình duyệt không sử dụng cửa hàng bình thường hoặc không cài đặt CA, bạn sẽ gặp lỗi chứng chỉ vì máy tính của bạn sẽ thấy chứng chỉ "Đã ký bởi XYZ Coperate Proxy", không biết ai là CA là, sau đó trả lại RemoteCertificateChainErrors trên đối số sslPolicyErrors.


Ví dụ về kiểm tra hàm băm của 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

Có ông có thể, * trên máy tính của mình chỉ * . Đó sẽ không phải là "Main In the Middle", kẻ tấn công kiểm soát điểm cuối, không có gì nhiều bạn có thể làm về điều đó. Bạn có thể đặt dấu vân tay của các CERT, nhưng một ý tưởng thông minh hơn sẽ được đặt dấu vân tay của các CA trong và kiểm tra xem, như vậy bạn có thể cấp giấy chứng nhận mới (nói rằng bạn cần phải thay đổi tên DNS bạn đang kết nối, bạn sẽ cần một cert mới và có một dấu vân tay cert mới). Tôi sẽ thêm một số mã nhanh để hiển thị như thế nào. –

+0

Vì vậy, Ssl chỉ là để bảo vệ máy khách-máy chủ của tôi khỏi tấn công MITM chứ không phải từ việc kiểm soát EndPoint của khách hàng của tôi? –

+0

Không thể bảo vệ điểm cuối. Nếu người dùng cuối có thể chạy mã tùy ý, bạn đã mất. Tất cả kẻ tấn công phải làm là đính kèm trình gỡ lỗi của riêng mình và họ có thể làm bất cứ điều gì họ muốn với chương trình đang chạy. Bạn có thể làm cho nó khó khăn trên chúng, nhưng bạn không thể ngăn chặn nó. Cách duy nhất để "Ngừng" là người dùng cuối không được phép chạy bất cứ thứ gì họ muốn. Một ví dụ về điều này là một ** un-jailbroken ** iPhone, một người dùng chỉ có thể chạy các ứng dụng từ cửa hàng ứng dụng, và cửa hàng không có công cụ gỡ lỗi, do đó, cho người dùng cuối không thể tấn công chương trình. Nhưng nếu jailbroken ... bạn là nơi bạn bắt đầu, không thể ngăn chặn nó. –

1

Nếu bạn đang sử dụng chứng chỉ tự ký của bạn, bạn cần phải sử dụng mã bạn trình bày nếu không nó là đủ để chỉ cần sử dụng

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

    } 
    return false; 
} 
Các vấn đề liên quan