如何检索用于构造X509AsymmetricSecurityKey的X.509证书?

时间:2012-10-06 05:16:01

标签: c# cryptography wif claims-based-identity

您可以使用X509AsymmetricSecurityKey(X509Certificate2)构造函数从X509AsymmetricSecurityKey实例构造X509Certificate2;但是可以从安全密钥中获取X509Certificate2实例吗?

作为一个并行示例,InMemorySymmetricSecurityKey类公开了一个GetSymmetricKey()方法,可用于检索对称密钥。

我曾希望看到X509AsymmetricSecurityKey类公开的等效方法,如 GetCertificate(),但我看到的最接近的方法是GetAsymmetricAlgorithm(字符串算法,bool privateKey)。

我真正追求的是能够验证使用证书私钥签名的邮件的数字签名,这意味着使用证书的公钥验证签名。

有没有办法使用安全密钥的非对称算法验证签名?

3 个答案:

答案 0 :(得分:3)

从X509Certificate2构造X509AsymmetricSecurityKey时,证书实例引用实际上放在密钥实例上名为 certificate 的私有属性中。

您自己的答案满足您的具体用例,但不是您的问题,您问题的真正答案是:

  

没有直接的方法,但你可以通过使用反射来实现。

X509AsymmetricSecurityKey x509Key = ...

X509Certificate2 cert = typeof(X509AsymmetricSecurityKey).GetField("certificate", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(x509Key) as X509Certificate2;

答案 1 :(得分:1)

虽然owlstead是正确的,但你无法从安全密钥中检索X.509证书;我应该指出的是,我正在尝试验证JSON网络令牌的数字签名,其中安全密钥包含公钥 - 私钥对的公共部分。

您实际上可以使用安全密钥来验证签名。以下是如何进行一般性处理的示例:

var data        = {Get data that was signed as an array of bytes}
var signature   = {Get signature as an array of bytes}

// key variable is of type X509AsymmetricSecurityKey

using(var rsa = key.GetAsymmetricAlgorithm(SecurityAlgorithms.RsaSha256Signature, false) as RSACryptoServiceProvider)
{
    if(rsa != null)
    {
        using(var halg = new SHA256CryptoServiceProvider())
        {
            if (!rsa.VerifyData(data, halg, signature))
            {
                throw new SecurityException("Signature is invalid.");
            }
        }
    }
}

答案 2 :(得分:0)

X509AsymmetricSecurityKeyX509Certificate2的一个组成部分。你在问轮胎是否可以取回一辆汽车。除了存储在其中的公钥(发行人,序列号,密钥使用,生效日期等)之外,X509证书还包含大量附加信息。

另一方面,InMemorySymmetricSecurityKey确实包含对称密钥的所有信息,因此可以使用GetSymmetricKey()检索完整密钥数据。请注意,GetSymmetricKey()仅返回字节数组,而不是语义对象实例。

Microsoft X509Certificate2唯一特别之处在于它与私钥链接,私钥不是X509数据格式的一部分。证书中的私钥和公钥是同一密钥对的一部分。这就是为什么私钥可以被认为是X509证书的一部分。它们通常也存储在一起,例如在PKCS#12数据格式中。我个人认为这只会让事情变得混乱。

如果要将证书与私钥链接,则可以使用密钥对的模数。它与私钥和公钥完全相同。在某些加密标准中,他们使用模数上的散列来执行此操作。因此,您可以创建从模数的哈希到证书的映射。如果您有私钥,请检索模数,计算哈希值并查找证书。