如何使用Compact Framework在C#中validationX.509证书

我正在尝试使用C#和.NetCFvalidationX.509证书。 我有CA证书,如果我理解正确,我需要使用此CA证书中的公钥来解密不受信任证书的签名。 这应该给我不受信任证书的计算哈希值。 然后我应该自己计算证书的哈希值并确保两个值匹配。

我已经玩了几天了,我没有走得太远。 我一直在使用X509Certificate和RSACryptoServiceProvider类。 首先,我尝试从X509Certificate类中获取公钥和签名。 我能够获得公钥而不是签名。 接下来,我尝试解析构成证书的二进制数据,这允许我获取签名(以及我想要的任何其他数据),但我无法使用RSACryptoServiceProvider解密签名。 我试过这样的事情,但在我试图解密的时候不断得到说“Bad Key”的exception:

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,但我不知道为什么。

思考?

这是我的代码。

 RSACryptoServiceProvider rsa = signingCertificate_GetPublicKey(); return rsa.VerifyData( SignedValue(), CryptoConfig.MapNameToOID( "SHA1" ), Signature() ); RSACryptoServiceProvider signingCertificate_GetPublicKey() { RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); RSAParameters publicKeyParams = new RSAParameters(); publicKeyParams.Modulus = GetPublicKeyModulus(); publicKeyParams.Exponent = GetPublicKeyExponent(); publicKey.ImportParameters( publicKeyParams ); return publicKey; } byte[] GetPublicKeyExponent() { // The value of the second TLV in your Public Key } byte[] GetPublicKeyModulus() { // The value of the first TLV in your Public Key } byte[] SignedValue() { // The first TLV in your Ceritificate } byte[] Signature() { // The value of the third TLV in your Certificate } 

我希望这有助于解决这个问题的任何人。

WinCE是否支持与Win32 MSCrypto.dll兼容的东西? 如果是,请查看.NET X509Certificate2类以及Codeplex上的CLR安全库。 它包含许多有用的.NET例程,它们位于核心操作系统加密库之上。 您可以下载源代码并查看它如何为.NetCF编译

要加载和validationX509证书,请执行以下操作(未经测试):

 var cert = new X509Certificate2("mycert.cer"); if (!cert.Verify()) {  } 

X509Certificate2有近十二个构造函数可以从各种来源构建 – 磁盘上的文件,内存中的字节数组,本地证书存储区的加载等。

用于签署证书的根CA需要安装在本地证书库中。 如果证书不包括信任链中的中间CA,则这些中间人也需要在本地计算机上,一直到本地计算机中受信任的证书存储中的根CA.

不幸的是,我无法从MSDN文档中看出X509Certificate2是否可用于.NetCF。

它在win32中适用于我,但在Compact Framework中我面临同样的问题,没有X509Certificate2所以我实际上已被阻止,我们可以使用win32:

 X509Certificate2 l__PublicKeyCertificate = new X509Certificate2("cert.cer"); RSACryptoServiceProvider l__rsaCspPublic = (RSACryptoServiceProvider)l__PublicKeyCertificate .PublicKey.Key; //... l__isVerified = l__rsaCspPublic.VerifyData(l__fileData, CryptoConfig.MapNameToOID("SHA1"), l__fileSignature);