Próbuję sprawdzić certyfikat X.509 przy użyciu C# i .NetCF. Mam certyfikat CA, a jeśli dobrze rozumiem, muszę użyć klucza publicznego z tego certyfikatu CA, aby odszyfrować podpis niezaufanego certyfikatu. To powinno dać mi obliczoną wartość mieszającą niezaufanego certyfikatu. Powinienem następnie obliczyć wartość mieszającą samego certyfikatu i upewnić się, że te dwie wartości są zgodne.Jak sprawdzić certyfikat X.509 w języku C# za pomocą Compact Framework
Bawiłem się tym przez kilka dni i nie zajmuję się daleko. Korzystam z klas X509Certificate i RSACryptoServiceProvider. Po pierwsze, próbowałem uzyskać klucz publiczny i podpis z klasy X509Certificate. Udało mi się zdobyć klucz publiczny, ale nie podpis. Następnie próbowałem analizować dane binarne składające się na certyfikat, co pozwoliło mi uzyskać podpis (i wszelkie inne dane, które chciałem), ale nie udało mi się odszyfrować podpisu za pomocą RSACryptoServiceProvider. Próbowałem rzeczy jak to, ale ciągle się wyjątki powiedzenie „Bad Key”, kiedy starałem się odszyfrować:
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
Wszelkie porady będą bardzo mile widziane.
Edytuj: Próbowałem czegoś, co wydaje się być lepsze, ale zwraca dziwny wynik. Pracuję z klasą X509Certificate2 tutaj, ponieważ jest nieco łatwiejsze do testowania, ale będę musiał przejść do certyfikatu X509Certyfikat dla .NetCF później. Myślę, że RSACryptoServiceProvider.VerifyData może być tym, czego potrzebuję. Próbowałem poniższy kod.
X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");
byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);
Jak powiedziałem, jestem w stanie ręcznie dekodować i interpretować dane binarne zaświadczenia, więc jestem dość pewny cert.RawData jest podpisane dane świadectwa i ostatnie 256 bajtów są szyfrowane podpis . Łańcuch jest identyfikatorem OID algorytmu mieszania, który otrzymałem z certyfikatu, ale nie jestem w 100% pewien, czy jest poprawny. VerifyData zwraca false, ale nie jestem jeszcze pewien, dlaczego.
Myśli?
Ograniczenia WinCE mogą być trudne i jestem zupełnie nowy w X.509, więc próbowałem uruchomić to w normalnym środowisku Win32, a nawet nie jestem w stanie tego zrobić. Rzuciłem okiem na bibliotekę bezpieczeństwa CLR, na którą wskazałeś, ale nie widziałem niczego, co by potwierdzało certyfikat X509. Czy możesz dać mi trochę więcej, aby kontynuować? – Ben
Zaktualizowałem odpowiedź za pomocą przykładowego kodu. – dthorpe
Certyfikat X509Certyfikat2 nie jest dostępny w .NetCF, ale jest to pomocne. Dzięki. – Ben