您可以使用X509AsymmetricSecurityKey(X509Certificate2)构造函数从X509AsymmetricSecurityKey实例构造X509Certificate2;但是可以从安全密钥中获取X509Certificate2实例吗?
作为一个并行示例,InMemorySymmetricSecurityKey类公开了一个GetSymmetricKey()方法,可用于检索对称密钥。
我曾希望看到X509AsymmetricSecurityKey类公开的等效方法,如 GetCertificate(),但我看到的最接近的方法是GetAsymmetricAlgorithm(字符串算法,bool privateKey)。
我真正追求的是能够验证使用证书私钥签名的邮件的数字签名,这意味着使用证书的公钥验证签名。
有没有办法使用安全密钥的非对称算法验证签名?
答案 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)
X509AsymmetricSecurityKey
是X509Certificate2
的一个组成部分。你在问轮胎是否可以取回一辆汽车。除了存储在其中的公钥(发行人,序列号,密钥使用,生效日期等)之外,X509证书还包含大量附加信息。
另一方面,InMemorySymmetricSecurityKey
确实包含对称密钥的所有信息,因此可以使用GetSymmetricKey()
检索完整密钥数据。请注意,GetSymmetricKey()
仅返回字节数组,而不是语义对象实例。
Microsoft X509Certificate2
唯一特别之处在于它与私钥链接,私钥不是X509数据格式的一部分。证书中的私钥和公钥是同一密钥对的一部分。这就是为什么私钥可以被认为是X509证书的一部分。它们通常也存储在一起,例如在PKCS#12数据格式中。我个人认为这只会让事情变得混乱。
如果要将证书与私钥链接,则可以使用密钥对的模数。它与私钥和公钥完全相同。在某些加密标准中,他们使用模数上的散列来执行此操作。因此,您可以创建从模数的哈希到证书的映射。如果您有私钥,请检索模数,计算哈希值并查找证书。