我使用EncryptedXml类来解密xml文档的一部分。Within被调用如下.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>
我在本地机器/个人证书存储中正确添加了证书。当执行代码时,我得到:
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);
对于这里的序列号,我得到了空集合。
然后将序号转换为十六进制值。我试了同样的方法,效果很好。
这里的问题是我有一个负的大整数还是别的什么?
问题是整数格式的负值序列号不满足RFC 3280 (https://www.rfc-editor.org/rfc/rfc3280#section-4.1.2.2),其中说:
4.1.2.2序号序列号必须是CA分配给的正整数每一个证书。它必须是唯一的,对于每个证书颁发给定的CA(即,发行者名称和序列号标识一个惟一的证书)。ca必须强制serialNumber为非负整数。
Microsoft代码遵循此标准。这将导致获取依赖于负序列号的证书失败。
我必须根据这个标准签发新的自签名证书