从 X509Certificate2 获取 X509SerialNumber 整数值

Getting X509SerialNumber integer value from X509Certificate2

我正在尝试获取 X509.v3 证书(我拥有 X509Certificate2 对象)的序列号,以将其放入 XADES XMLDSIG 中的 X509SerialNumber 元素中,这应该是一个整数。 我有一个 XML 由其他软件使用我正在使用的证书制作的签名,这是它的序列号:

<X509SerialNumber xmlns="http://www.w3.org/2000/09/xmldsig#">1315010063538360283821765366094690</X509SerialNumber>

不幸的是,我无法从使用用于签署上述 XML 的证书初始化的 X509Certificate2 对象中获取此值。这些是我得到的价值

X509Certificate2->SerialNumber = "40D5C2ADDEFD92740000000B9B62"
X509Certificate2->GetSerialNumber() = "40D5C2ADDEFD92740000000B9B62"
Convert::ToBase64String(X509Certificate2->GetSerialNumber()) = "YpsLAAAAdJL93q3C1UA="

我认为 GetSerialNumber() return 是一个 Base64String。如您所见,GetSerialNumber()GetSerialNumber() return 不同的值。从这些值中获取值“1315010063538360283821765366094690”的整数的方法是什么?

您的对象中的序列号与XML中的序列号完全相同,但采用十六进制表示法。所以真正的问题是“给定一个大的十六进制字符串,如何获得它的十进制表示形式?” 如果您的目标是 NET 4+,则可以使用 BigInteger。

像这样的东西应该可以工作:

var serialHexString = "40D5C2ADDEFD92740000000B9B62";
var serial = BigInteger.Parse(serialHexString, NumberStyles.HexNumber);