【问题标题】:How to validate X.509 Certificate in C# using Compact Framework如何使用 Compact Framework 在 C# 中验证 X.509 证书
【发布时间】:2011-04-07 12:37:26
【问题描述】:

我正在尝试使用 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,但我还不知道为什么。

想法?

【问题讨论】:

    标签: c# .net encryption compact-framework x509


    【解决方案1】:

    这是我的代码。

    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
    }
    

    我希望对正在解决此问题的任何人有所帮助。

    【讨论】:

      【解决方案2】:

      它在 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);
      

      【讨论】:

      • 我前一阵子想通了,忘记发布答案了。我会看看我的源代码,并在星期一得到答案。
      【解决方案3】:

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

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

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

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

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

      不幸的是,我无法从 MSDN 文档中判断 X509Certificate2 是否在 .NetCF 上可用。

      【讨论】:

      • WinCE 的限制可能很粗略,而且我对 X.509 完全陌生,所以我实际上一直在尝试首先让它在正常的 Win32 环境中工作,我什至无法做到这一点.我查看了您指向的 CLR 安全库,但我没有看到任何可以验证 X509 证书的内容。你能再给我一点继续吗?
      • X509Certificate2 在 .NetCF 上不可用,但这很有帮助。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 2011-10-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多