2010-12-17 6 views
0

ich den folgenden Code verwenden:X509CertificateStore.FindCertificateBySubjectName funktioniert nicht in x64?

store = X509CertificateStore.LocalMachineStore(X509CertificateStore.RootStore); 

      store.OpenRead(); 

      Microsoft.Web.Services2.Security.X509.X509CertificateCollection certs = 
       store.FindCertificateBySubjectName("CN=my cert bla bla"); 

      if (certs.Count == 0) { 
       Console.WriteLine("Not found!"); 
      } 

Wenn ich auf x86 meine Plattform Ziel gesetzt, es funktioniert ... wenn ich es (oder jede CPU) setzen x64 sagt es nicht gefunden. Ich bin verwirrt, jede Hilfe?

Vielen Dank.

+0

Und das geschieht nur in einer 64-Bit-Maschine ... – Ishmail

+0

Gibt es einen Grund, warum Sie die WSE-Version dieser Objekte anstelle von denen, innerhalb System.Security.Cryptography.X509Certificates verwenden? – EricLaw

Antwort

0

Es sieht aus, als gäbe es einen Fehler in den Find-Methoden dieser Klasse, der verhindert, dass sie in x64 arbeiten. Insbesondere verwenden sie IntPtrs, um Daten an native Methoden zu senden.

Als eine Arbeit umgehen können Sie die Zertifikate im Laden durchlaufen und führen Sie Ihren Vergleich manuell (siehe Beispiel unten), obwohl auch im Hack wäre es besser, den Fingerabdruck oder die Seriennummer zu verwenden.

Eine bessere Lösung ist, Ihre Anwendung neu zu plombieren, um die unterstützte Klasse System.Security.Cryptography.X509Certificates.X509Store zu verwenden, um auf Ihre Zertifikate zuzugreifen. Diese Klasse funktioniert im 64-Bit-Modus.

foreach(X509Certificate cert in store.Certificates) 
{ 
    if (cert != null && cert.Subject.Contains("CN=my cert bla bla")) 
     return cert; 
} 
Console.WriteLine("Not found!");