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

时间:2014-06-27 09:59:46

标签: c# encryption cryptography x509certificate

我使用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);

对于我在这里的序列号,我收到了空集。

然后我将序列号转换为十六进制值。并尝试了相同的方法,它完美地运作。

这里的问题是我有负大整数还是其他什么? 否定很可能是因为我使用的是自签证书。

1 个答案:

答案 0 :(得分:0)

问题是整数格式的负值序列号不满足RFC 3280(http://tools.ietf.org/html/rfc3280#section-4.1.2.2),其中说:

4.1.2.2序列号    序列号必须是CA分配的正整数    每个证书。对于每个颁发的证书,它必须是唯一的    给定CA(即发行者名称和序列号标识唯一    证书)。 CA必须强制serialNumber为非负数    整数。

Microsoft代码遵循此标准。这导致获取证书失败取决于负序号。

我必须签发符合此标准的新自签名证书。