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



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

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

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

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

有没有一种方法可以使用安全密钥的非对称算法来验证签名?

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

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

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

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

虽然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.");
}
}
}
}

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

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

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

如果要将证书与私钥链接,则可以使用密钥对的模数。私钥和公钥是相同的。在一些加密标准中,它们使用模上的散列来实现这一点。因此,您可以创建一个从模数上的散列到证书的映射。如果您获得了私钥,请检索模数,计算哈希,然后找到证书。

相关内容

  • 没有找到相关文章

最新更新