从十进制值序列号获取证书失败



我使用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代码遵循此标准。这将导致获取依赖于负序列号的证书失败。

我必须根据这个标准签发新的自签名证书

相关内容

  • 没有找到相关文章

最新更新