2013-02-18 32 views
13

Tôi đã nhập chứng chỉ của mình vào Cá nhân -> Chứng chỉ.Không thể tìm thấy chứng chỉ theo số sê-ri

tôi sử dụng dòng mã sau đây để tìm giấy chứng nhận của tôi bằng số serial nhưng tôi không thể:

public X509Certificate2Collection FindCerts(string serialNumber) 
    { 
     var searchType = X509FindType.FindBySerialNumber; 
     var storeName = "MY"; 

     var certificatesStore = new X509Store(storeName, StoreLocation.LocalMachine); 
     certificatesStore.Open(OpenFlags.OpenExistingOnly); 

     var matchingCertificates = certificatesStore.Certificates.Find(searchType, serialNumber, true); 

     certificatesStore.Close(); 

     return matchingCertificates; 
    } 

Ông có thể xin vui lòng cho tôi biết tại sao tôi không thể tìm thấy cert của tôi mặc dù nó đang ở trong certificatesStore Danh sách chứng chỉ?

Lưu ý: Certs của tôi đã được tạo ra bởi Go Daddy

Trả lời

17

Tôi đã khắc phục vấn đề này bằng cách nhập số serial thay vì sao chép từ cửa sổ tài sản. Tôi không biết tại sao khi sao chép từ cửa sổ này, nó chứa một ký tự lạ vào đầu số sê-ri.

+6

có thể xác nhận vấn đề này. Có một ký tự trước số sê-ri trong cửa sổ thuộc tính. Khi sao chép vào VS nó không nhìn thấy được, nhưng nó ở đó. – randoms

0

Nếu bạn chắc chắn về sự có mặt của giấy chứng nhận trong cửa hàng máy, bạn có thể thử đưa ra các tham số thứ ba để tìm() là 'giả'?

+0

Tôi đã cố gắng Tìm() là 'sai' nhưng đã không hoạt động. Khi cố gắng để gỡ lỗi, tôi thấy cert của tôi trong certificateStore.Certificates collection: certificatesStore.Certificates [2] là chính xác những gì tôi muốn tìm. – Phuc

+0

Bạn có thể nhận được bất kỳ chứng chỉ nào khác trong cùng một cửa hàng hoặc trong một cửa hàng khác không? Bạn có thể thử nhận chứng chỉ được tạo bằng phương thức khác (ví dụ: sử dụng công cụ 'makecert') không? '> makecert -r -len 2048 -a sha256 -n" CN = Kiểm tra "-sr LocalMachine -sk test_key1 -ss My' Hy vọng bạn đang cung cấp số sê-ri mà không có bất kỳ dấu cách nào ... – hasmit

+0

Có, đang có 7 giấy chứng nhận trong cửa hàng "MY", tôi có thể nhận được một số trong số họ, các chứng chỉ GoDaddy không thể được tìm thấy bằng cách sử dụng phương pháp này. – Phuc

0

Số sê-ri chứng chỉ là chuỗi dữ liệu nhị phân biểu thị một số lượng lớn không giới hạn độ dài. Nếu bạn thấy văn bản ở đâu đó, điều này có thể có nghĩa là văn bản được viết dưới dạng nối tiếp HOẶC (có nhiều khả năng hơn) mà bạn đang nhìn thấy chuỗi nhị phân Base64 hoặc Base16-mã hóa. Trong trường hợp sau bạn sẽ không tìm thấy nó một cách đơn giản - bạn cần phải giải mã serial và thử theo cách đó.

0

Nếu những gì bạn đang cố gắng để giải nén được giấy chứng nhận/s do GoDaddy, bạn có thể sử dụng này:

var certificateStore= new X509Store(StoreLocation.LocalMachine); 
certificateStore.Open(OpenFlags.ReadOnly); 
var certificates = certificateStore.Certificates; 
foreach (var certificate in certificateStore) 
      { 
       if (certificate.Issuer.Contains("GoDaddy")) 
       { 
0

Đảm bảo rằng serialNumber là chuỗi chữ hoa. Tôi đã có một số vấn đề với việc tìm kiếm chứng chỉ khi sn ở dạng chữ thường. Đồng thời xóa khoảng trắng nếu bạn sao chép từ cửa sổ chi tiết của chứng chỉ

6

Kể từ khi tôi tình cờ gặp vấn đề này quá, tôi đã cố gắng để tạo ra một cách giải quyết để có thể copy dán giá trị từ certmgr.msc

Một bản tóm tắt về những gì tôi đã làm:

// The value below is pasted from certmgr.msc 
var sslCertificateSerialNumber="‎47 9f da c4 ad d7 33 a6 4c ad 54 d3 d9 95 67 1c"; 


// Remove all non allowed characters that entered the value while copy/paste 
var rgx = new Regex("[^a-fA-F0-9]"); 
var serial = rgx.Replace(sslCertificateSerialNumber, string.Empty).ToUpper(); 

Bây giờ tôi đã tìm thấy chứng chỉ chính xác với giá trị sao chép/dán.

0

Tôi đã gặp sự cố tương tự ngày hôm qua và đã dành một số giờ cố gắng tìm hiểu lý do tại sao trên trái đất chứng chỉ hiện tại không được tìm thấy. Dường như phương thức Certificates.Find thực hiện tìm kiếm phân biệt chữ hoa chữ thường. Tôi đã tiếp cận đệ quy bằng cách sử dụng String.Compare.

X509Certificate2 storedCert = null; 
for (int i = 0; i < store.Certificates.Count; i++) 
{ 
    if (String.Compare(store.Certificates[i].SerialNumber, MySerialNum, true) == 0) 
    { 
     storedCert = store.Certificates[i]; 
     break; 
    } 
} 
0

Để tìm theo số sê-ri, bắt đầu từ dãy nối tiếp như được báo cáo bởi phần đính kèm mmc, xóa tất cả khoảng trắng và chữ hoa tất cả các chữ cái. Đã làm cho tôi. Điều này sẽ cung cấp cho bạn một cái gì đó như ...

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