Я пытаюсь проверить сертификат X.509, используя C # и .NetCF. У меня есть сертификат CA, и если я правильно понимаю, мне нужно использовать открытый ключ из этого сертификата CA для расшифровки подписи ненадежного сертификата. Это должно дать мне вычисленное значение хэша ненадежного сертификата. Затем я должен сам вычислить хэш сертификата и убедиться, что оба значения совпадают.
Я играл с этим несколько дней, и я не очень далеко ухожу. Я использую классы X509Certificate и RSACryptoServiceProvider. Сначала я попытался получить открытый ключ и подпись из класса X509Certificate. Я смог получить открытый ключ, но не подпись. Затем я попытался проанализировать двоичные данные, составляющие сертификат, что позволило мне получить подпись (и любые другие данные, которые я хотел), но я не смог расшифровать подпись с помощью RSACryptoServiceProvider. Я пробовал что-то вроде этого, но продолжал получать исключения, говорящие «Плохой ключ», когда я пытался расшифровать:
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
Любой совет будет принят с благодарностью.
Edit:
Я попробовал что-то, что кажется лучше, но возвращает странный результат. Я работаю с классом X509Certificate2 здесь, потому что его немного легче тестировать, но позже мне нужно будет переключиться на X509Certificate для .NetCF. Я думаю, что RSACryptoServiceProvider.VerifyData может быть то, что мне нужно. Я попробовал следующий код.
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);
Как я уже сказал, я могу вручную декодировать и интерпретировать двоичные данные сертификата, поэтому я почти уверен, что cert.RawData - это подписанные данные сертификата, а последние 256 байтов - зашифрованная подпись. Строка - это OID алгоритма хеширования, который я получил из сертификата, но я не уверен на 100%, что это правильно. VerifyData возвращает false, но я пока не уверен, почему.
Мысли?