2013-02-18 12 views
13

Ho importato i miei certificati su Personale -> Certificati.Impossibile trovare il certificato per numero di serie

utilizzare le seguenti righe di codice per trovare il mio certificato dal numero di serie, ma non posso:

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

La prego di dirmi perché non riesco a trovare il mio cert anche se è in certificatesStore . Elenco dei certificati?

Nota: certificati personali sono stati creati da Go Daddy

risposta

17

Ho risolto questo problema inserendo il numero di serie, invece di copiare dalla finestra delle proprietà. Non so perché quando si copia da questa finestra, contiene uno strano carattere all'inizio del numero di serie.

+6

può confermare questo problema. C'è un carattere prima del numero di serie nella finestra delle proprietà. Quando viene copiato su VS non è visibile, ma è lì. – randoms

0

Se siete sicuri circa la presenza di certificati in deposito macchina, si può provare a dare il terzo parametro per trovare() come 'false'?

+0

Ho provato a trovare() come 'falso' già ma non funziona. Quando provo a eseguire il debug, vedo il mio cert nella collezione certificatesStore.Certificates: certificatesStore.Certificates [2] è esattamente ciò che voglio trovare. – Phuc

+0

Sei in grado di ottenere altri certificati nello stesso negozio o in un altro negozio? Puoi provare a ottenere un certificato creato utilizzando un metodo diverso (ad esempio, utilizzando lo strumento 'makecert')? '> makecert -r -len 2048 -a sha256 -n" CN = Test "-sr LocalMachine -sk test_key1 -ss My' Spero che stiate dando il numero di serie senza spazi ... – hasmit

+0

Sì, ci sono 7 certificati nel negozio "MY", sono in grado di ottenere alcuni di questi, i certificati GoDaddy non possono essere trovati usando questo metodo. – Phuc

0

Il numero di serie del certificato è una sequenza di dati binari che denota una grande int di lunghezza illimitata. Se hai visto il testo da qualche parte, questo può significare che sia il testo sia stato scritto come seriale OR (che è più probabile) che stai vedendo sia seriale seriale Base64 o Base16- codificata. In quest'ultimo caso non lo troverai in modo diretto - devi decodificare il seriale e provare in questo modo.

0

Se ciò che si sta cercando di estrarre sono il certificato/s rilasciato da GoDaddy, è possibile utilizzare questo:

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

Assicurarsi che serialNumber sia una stringa in caratteri maiuscoli. Ho avuto alcuni problemi con la ricerca dei certificati quando sn era in minuscolo. Rimuovere anche gli spazi bianchi se si copia sn dalla finestra dei dettagli del certificato

0

Se si copia dalla finestra delle proprietà dei certificati di Windows, è possibile che vengano copiati accidentalmente alcuni caratteri invisibili aggiuntivi, che interromperanno la ricerca del numero di serie.

Vedere questa domanda per ulteriori informazioni: X509 store can not find certificate by SerialNumber

6

Dal momento mi sono imbattuto in questo problema troppo, ho cercato di fare una soluzione per essere in grado di copiare incollare il valore dal certmgr.msc

Una sintesi di quello che ho fatto:

// 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(); 

Ora ho trovato il certificato corretto con una copia/valore incollato.

0

Mi sono imbattuto in un problema simile ieri e ho trascorso un numero di ore cercando di scoprire perché mai il certificato esistente non veniva trovato. Sembra che il metodo Certificates.Find esegua una ricerca case-sensitive. Ho preso l'approccio ricorsivo usando 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

da trovare il numero di serie, a partire dalla serie come riportato dagli snap-in MMC, rimuovere tutti gli spazi e maiuscolo tutti alfa. Ha funzionato per me Questo ti darà qualcosa come ...

008CC59B72BE954F93F1435F6B86227600 
Problemi correlati