我正在尝试使用 C# 和 .NetCF 验证 X.509 证书。我有 CA 证书,如果我理解正确的话,我需要使用该 CA 证书中的公钥来解密不受信任的证书的签名。这应该给我不可信证书的计算哈希值。然后我应该自己计算证书的哈希值并确保两个值匹配。
我已经玩了几天了,但还没有走得太远。我一直在使用 X509Certificate 和 RSACryptoServiceProvider 类。首先,我尝试从 X509Certificate 类中获取公钥和签名。我能够获得公钥,但无法获得签名。接下来,我尝试解析组成证书的二进制数据,这使我能够获取签名(以及我想要的任何其他数据),但我无法使用 RSACryptoServiceProvider 解密签名。我尝试了类似的操作,但当我尝试解密时,不断收到异常提示“Bad Key”:
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
任何建议将不胜感激。
编辑:
我尝试了一些似乎更好的方法,但返回了一个奇怪的结果。我在这里使用 X509Certificate2 类,因为它更容易测试,但稍后我需要切换到 .NetCF 的 X509Certificate。我认为 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,但我还不知道为什么。
想法?