我使用EncryptedXml类来解密部分xml文档。 内部称为.Net方法:
public virtual SymmetricAlgorithm GetDecryptionKey (EncryptedData encryptedData, string symmetricAlgorithmUri)
xml文档的节点使用自签名证书加密。 以下是xml密钥信息详细信息:
<KeyInfo>
<ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=certName</ds:X509IssuerName>
<ds:X509SerialNumber>-180xxx</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</KeyInfo>
我在LocalMachine / Personal证书库中正确添加了证书。 当我执行代码时:
System.Security.Cryptography.CryptographicException: Unable to retrieve the decryption key.
at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri)
at Webcom.Common.Federation.Saml.CustomEncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) in
然后我反映了.Net代码并发现它执行了类似的事情:
public static void GetFromSerial(string serialName, string serialNumber)
{
X509Certificate2Collection collection = new X509Certificate2Collection();
X509Store[] stores = new X509Store[2];
string storeName = "My";
stores[0] = new X509Store(storeName, StoreLocation.CurrentUser);
stores[1] = new X509Store(storeName, StoreLocation.LocalMachine);
for (int index = 0; index < stores.Length; index++)
{
X509Certificate2Collection filters = null;
stores[index].Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
filters = stores[index].Certificates;
stores[index].Close();
filters = filters.Find(X509FindType.FindByIssuerDistinguishedName, serialName, false);
filters = filters.Find(X509FindType.FindBySerialNumber, serialNumber, false);
if (filters != null)
collection.AddRange(filters);
}
}
问题在于:
filters = filters.Find(X509FindType.FindBySerialNumber, serialNumber, false);
对于我在这里的序列号,我收到了空集。
然后我将序列号转换为十六进制值。并尝试了相同的方法,它完美地运作。
这里的问题是我有负大整数还是其他什么? 否定很可能是因为我使用的是自签证书。
答案 0 :(得分:0)
问题是整数格式的负值序列号不满足RFC 3280(http://tools.ietf.org/html/rfc3280#section-4.1.2.2),其中说:
4.1.2.2序列号 序列号必须是CA分配的正整数 每个证书。对于每个颁发的证书,它必须是唯一的 给定CA(即发行者名称和序列号标识唯一 证书)。 CA必须强制serialNumber为非负数 整数。
Microsoft代码遵循此标准。这导致获取证书失败取决于负序号。
我必须签发符合此标准的新自签名证书。