我试图验证使用C#和.NetCF的X.509证书。我有CA证书,如果我理解正确的话,我需要使用公共密钥从该CA证书解密不受信任的证书的签名。这应该给我的不信任证书的计算哈希值。那么我应该计算证书的哈希自己,并确保这两个值相符。

我一直在玩这几天,我没有得到很远。我一直在使用X509证书和的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);

任何意见,将不胜感激。

编辑: 我试过的东西,这似乎是更好,但返回一个奇怪的结果。我在这里的X509Certificate2类工作,因为它更容易测试了一下,但我以后需要切换到X509证书的.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,但我不知道为什么还没有。

思考?

有帮助吗?

解决方案

下面是我的代码。

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

要加载和验证X509证书,这样做(未测试的):

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

有将近一打构造为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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top