2009-07-27 2 views
5

Tôi không thể yêu cầu người dùng tạo chứng chỉ thực cho máy chủ của họ nhưng tôi muốn thực hiện một số kiểm tra bảo mật. Vì vậy, sau đây là quá nhẹ bởi vì, như tôi đọc nó, có không kiểm tra trên các certs.. Lập trình Net: Những gì để xác thực trên chứng chỉ tự ký SSL

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Bạn khuyên khách hàng nào nên kiểm tra chứng chỉ x509? Cho rằng tôi đang sử dụng một ngôn ngữ .NET (C#/f #).

Trả lời

4

Nếu bạn không thể yêu cầu khách hàng tạo các chứng thực thực, ít nhất bạn nên cố gắng tạo cho họ các chứng chỉ sử dụng máy chủ của bạn. Sau đó, bạn có thể kiểm tra xem chứng chỉ có hợp lệ hay ít nhất từ ​​CA của bạn vì bạn sẽ biết liệu CA của bạn có bị xâm nhập hay không. Nếu bạn tin tưởng bất kỳ và tất cả các CA thực sự không có gì đáng để kiểm tra.

+0

+1 đồng ý hoàn toàn. Trừ khi bạn có thể tin tưởng CA phát hành, thì phần còn lại của chứng chỉ là khá vô nghĩa. Nếu bạn không thể sử dụng các chứng chỉ * real *, thì Spencer nói, xem liệu bạn có thể thiết lập (hoặc đã có) CA của riêng bạn mà bạn có thể tin tưởng và cấp chứng chỉ cho người dùng của bạn từ đó không. –

+0

Có điều này là một tình huống xấu nhưng tôi đang cố gắng làm cho nó ít hơn như vậy. Ít nhất tôi sẽ kiểm tra xem tên trong cert khớp với URL đã cho hay chưa. – telesphore4

5

Nếu bạn đang sử dụng chứng chỉ tự ký thì các lỗi duy nhất bạn nên mong đợi là lỗi chuỗi trên gốc (Cert. Issuer). Tôi sẽ đề nghị một cái gì đó như thế này mà bẫy cho rằng chuỗi lỗi cụ thể và cho phép tất cả các lỗi khác rơi qua.

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
    ValidateRemoteCertificate 
); 

private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) 
{ 
    string trustedIssuer = "CN=www.domain.com"; 
    string trustedDomain = "CN=www.domain.com"; 
    bool policyErr = false; 

    switch (policyErrors) 
    { 
     case SslPolicyErrors.None: 
      policyErr |= false; 
      break; 
     case SslPolicyErrors.RemoteCertificateChainErrors: 
      bool chainErr = false; 
      foreach (X509ChainStatus status in chain.ChainStatus) 
      { 
       switch (status.Status) 
       { 
        case X509ChainStatusFlags.NoError: 
         chainErr |= false; 
         break; 
        case X509ChainStatusFlags.UntrustedRoot: 
         if (certificate.Subject != trustedDomain || certificate.Issuer != trustedIssuer) 
          chainErr |= true; 
         else 
          chainErr |= false; 
         break; 
        default: 
         chainErr |= true; 
         break; 
       }      
      } 
      policyErr |= chainErr; 
      break; 
     default: 
      policyErr |= true; 
      break; 
    } 

    return !policyErr; 
} 
1

nếu bạn có thể kiểm tra Certs bạn có thể đặt logic xác nhận của riêng bạn trong các chức năng ValidateRemoteCertificate

System.Net.ServicePointManager.ServerCertificateValidationCallback += (a, b, c, d) => 
{ 
    return ValidateRemoteCertificate(a, b, c, d); 
}; 

private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, 
      X509Chain chain, SslPolicyErrors policyErrors) 
{ 
      if (certificate.Subject.Equals("CN=www.domain.com")) 
       return true; 
      else 
       return policyErrors == SslPolicyErrors.None; 

} 
+0

Xin đừng làm điều này. Điều này tệ hơn không có gì bởi vì nó cung cấp ảo ảnh về an ninh nhưng không có gì. Bất kỳ ai có thể tạo ra một cert với chuỗi "CN = www.domain.com" trong đó. – Daryl