2

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

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

我曾希望看到 X509AsymmetricSecurityKey 类公开的类似GetCertificate()的等效方法,但我看到的最接近的方法是 GetAsymmetricAlgorithm(string algorithm, bool privateKey)。

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

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

4

3 回答 3

3

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

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

没有直接的方法,但是您可以使用反射来做到这一点。

X509AsymmetricSecurityKey x509Key = ...

X509Certificate2 cert = typeof(X509AsymmetricSecurityKey).GetField("certificate", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(x509Key) as X509Certificate2;
于 2014-12-15T13:01:34.640 回答
1

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

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

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.");
            }
        }
    }
}
于 2012-10-16T19:15:36.697 回答
0

X509AsymmetricSecurityKey是 的一个组成部分X509Certificate2。您是在询问是否可以在给定轮胎的情况下取回汽车。X509 证书除了存储在其中的公钥之外还包含大量附加信息(颁发者、序列号、密钥使用情况、生效日期等)。

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

微软唯一的特别之处X509Certificate2在于它与私钥相关联,这不是 X509 数据格式的一部分。证书中的私钥和公钥是同一密钥对的一部分。这就是为什么可以将私钥视为 X509 证书的一部分的原因。它们也经常存储在一起,例如以 PKCS#12 数据格式。我个人认为这只会混淆问题。

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

于 2012-10-06T11:15:07.287 回答