2015-02-27 47 views
7

Đối mặt với một vấn đề thực sự lạ X509Certificate2.Verify() trả về false cho một chứng chỉ hợp lệ. Có lẽ một số đã phải đối mặt với kịch bản kỳ lạ này trước đây và có thể tỏa sáng một chút trên đó.X509Certificate2.Verify() trả về false luôn

Tôi đang sử dụng openssl để tạo chứng chỉ ứng dụng khách cho mục đích thử nghiệm. Tôi tạo một CA gốc và tạo chứng chỉ ứng dụng khách dựa trên Root CA đó và thêm Root CA vào chuỗi của nó.

Tôi nạp CA gốc và chứng chỉ ứng dụng khách vào kho lưu trữ chứng chỉ cục bộ và có vẻ ok ở đó nhưng khi tôi tải nó từ mã NUnit để kiểm tra X509Certificate2.Verify() luôn trả về false.

enter image description here

Đây là đoạn mã để tải Cert từ các cửa hàng:

 X509Store store = new X509Store(StoreName.My); 
     string thumbprint = "60 d1 38 95 ee 3a 73 1e 7e 0d 70 68 0f 2d d0 69 1e 9a eb 72"; 
     store.Open(OpenFlags.ReadOnly); 
     var mCert = store.Certificates.Find(
           X509FindType.FindByThumbprint, 
           thumbprint, 
           true 
          ).OfType<System.Security.Cryptography.X509Certificates.X509Certificate>().FirstOrDefault(); 
     if(mCert != null) 
     { 
      var testClientCert = new X509Certificate2(mCert); 
     } 

Đây là Cert khách hàng mà tôi đã tạo ra: (url CRL có thể truy cập từ máy tính địa phương của tôi đúng)

-----BEGIN CERTIFICATE----- 
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMR0wGwYDVQQKExRWaXRh 
bEhlYWx0aCBTb2Z0d2FyZTElMCMGA1UECxMcVml0YWxIZWFsdGggU29mdHdhcmUg 
Um9vdCBDQTElMCMGA1UEAxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQTAe 
Fw0xNTAyMjcwODQ2MzNaFw0xNjAyMjcwODQ2MzNaMEUxHTAbBgNVBAoTFFZpdGFs 
SGVhbHRoIFNvZnR3YXJlMREwDwYDVQQLEwhQbGF0Zm9ybTERMA8GA1UEAxMIVGVz 
dFVzZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOkfyjX0PSnRYrBbCC8u 
rw7IiFdAUj6frPKEmt0TLAR/4g+NazKdGjRRqxE9mNwX/2zGhIcucfGDVwPtOtiV 
opicQEzGiSQkvAc+473MN5D6j3XtBYblALMeMyEYoh3LnHO4K+6kV6XE4BXV/2lV 
mAVgXGkZzaayd40DLvg48vPlAgMBAAGjgcUwgcIwCQYDVR0TBAIwADARBglghkgB 
hvhCAQEEBAMCB4AwCwYDVR0PBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMDEG 
CWCGSAGG+EIBDQQkFiJPcGVuU1NMIENlcnRpZmljYXRlIGZvciBTU0wgQ2xpZW50 
ME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9wbGF0Zm9ybWRhc2hib2FyZC5ubC52 
aXRhbGhlYWx0aC5sb2NhbC9wb3J0YWwvY3JsLmNybDANBgkqhkiG9w0BAQUFAAOB 
gQBXYSmZaVu6vnyl94SO4qpNOutsUm4p7fQHehljhZ+aRrXE10rivWCt4g0k961E 
PDsp4J0DR6uth6et42pBp8v2gFIGSQY/F7NhmOAsOJvM7z0oIBxMLcclIDTygbRp 
KjZZpNjvf+YJasbidosiL4VSeRiCZ+HPzvKDb3wNeafoZA== 
-----END CERTIFICATE----- 

Và đây là tệp CRL được tải xuống khi tôi truy cập nó từ trình duyệt:

-----BEGIN X509 CRL----- 
MIIBMjCBnDANBgkqhkiG9w0BAQUFADBtMR0wGwYDVQQKExRWaXRhbEhlYWx0aCBT 
b2Z0d2FyZTElMCMGA1UECxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQTEl 
MCMGA1UEAxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQRcNMTQwODA3MTQz 
OTIyWhcNMTQwOTA2MTQzOTIyWjANBgkqhkiG9w0BAQUFAAOBgQA8MSxAorbxpdDm 
1IA2Aqjb/OkZydua1Tm5k5KtHknI4zyYPZb3GzO0eRygpKBSAqtYkxDI6eCv6xgf 
+anXT56md+cPGZ+2YvSicxqwP2GL2kymc9mVMTiQieioS1/7apjCIjZEgWxqf3Up 
zvy/kNQRg3lII8hYu0idGs9byKZJFQ== 
-----END X509 CRL----- 
+0

Có một số câu hỏi về vấn đề này, như thế này: http://stackoverflow.com/questions/1277791/x509certificate2-validation-on-web- dịch vụ Bạn đã thử bất kỳ điều nào trong số này chưa? – weston

+0

@weston Vâng, thực sự. Tôi đã kiểm tra liên kết sau có vẻ như của tôi, http://stackoverflow.com/questions/10137208/x509certificate2-verify-method-always-return-false-for-the-valid-certificate?rq=1 nhưng sau đó tôi có thể truy cập url CRL trong chứng chỉ máy khách của tôi tốt từ trình duyệt và tôi đang sử dụng các kiểm tra Nunits chạy trong tài khoản người dùng Windows cục bộ mà tôi đã sử dụng để cài đặt Cert và RootCA của nó vào cửa hàng Cert hiện tại cho người dùng Windows này . – Deb

+0

vui lòng xuất chứng chỉ này sang tệp và hiển thị cho chúng tôi đầu ra lệnh certutil: 'certutil -verify -urlfetch \ file.cer'. – Crypt32

Trả lời

13

Theo tài liệu X509Certificate2.Verify

Phương pháp này xây dựng một chuỗi đơn giản cho chứng chỉ và áp dụng chính sách cơ sở để chuỗi đó. Nếu bạn cần thêm thông tin về lỗi, hãy xác thực chứng chỉ trực tiếp bằng đối tượng X509Chain.

Vì vậy, tôi sẽ cố gắng để xây dựng chuỗi sử dụng mã này (thay thế phương pháp Log với thực hiện riêng của bạn, tôi đã sử dụng Console.WriteLine)

X509Chain chain = new X509Chain(); 

try 
{ 
    var chainBuilt = chain.Build(testClientCert); 
    Log(string.Format("Chain building status: {0}", chainBuilt)); 

    if (chainBuilt == false) 
     foreach (X509ChainStatus chainStatus in chain.ChainStatus) 
      Log(string.Format("Chain error: {0} {1}", chainStatus.Status, chainStatus.StatusInformation)); 
} 
catch (Exception ex) 
{ 
    Log(ex.ToString()); 
} 

Mã này sẽ cho bạn biết lý do tại sao các giấy chứng nhận có thể chưa được xác minh. Nếu bạn cần phải điều chỉnh chính sách chuỗi sau đó thiết lập chain.ChainPolicy sở hữu tức là

chain.ChainPolicy = new X509ChainPolicy() 
{ 
    RevocationMode = X509RevocationMode.NoCheck, 
    VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid, 
    UrlRetrievalTimeout = new TimeSpan(0, 1, 0) 
}; 
+0

Vâng, đúng vậy. Nhưng trước tiên tôi muốn thực hiện kiểm tra cơ bản nếu chứng chỉ hợp lệ và sau đó kiểm tra toàn bộ chuỗi.Tôi không muốn lãng phí thời gian vào việc kiểm tra toàn bộ chuỗi (mà bằng cách này có thể rất lớn trong trường hợp của tôi) trước khi xác minh cơ bản vượt qua chứng chỉ mà tôi nghĩ là một trường hợp sử dụng đơn giản và hợp lệ. – Deb

+1

Mã này đã giúp tôi tìm ra lý do tại sao Verify() trả về false. ChuỗiStatus.StatusInformation trả về những điều sau: "Chức năng thu hồi không thể kiểm tra việc thu hồi chứng chỉ." Trong trường hợp của bạn, trạng thái có thể khác nhau, nhưng tôi tin rằng mã trên hữu ích cho việc khắc phục sự cố. – user3308241

+1

@Deb Xác minh xây dựng toàn bộ chuỗi, nhưng ném nó đi. Bạn cũng có thể tự xây dựng nó (miễn là bạn Vứt bỏ nó (4.6) hoặc gọi Reset trên nó (khác) khi hoàn thành). – bartonjs

Các vấn đề liên quan