我正在尝试使用 Org.BouncyCastle.X509 转储证书吊销列表(CRL)的内容。在此用例中,我需要获取“十六进制”字符串表示形式的证书序列号列表,正如它们出现在证书 MMC 管理单元中一样(示例值为16a03c2c000000000594)。
\n\n我能够达到这样的程度:我有一个 X509CRLEntry 对象的集合可供迭代,但SerialNumber属性的类型为Org.BouncyCastle.Math.BigInteger。这种类型有一个ToString()的实现,但是,返回的值对我来说不可用:
\n\npublic CRLProc(string CRLFile)\n {\n X509CrlParser Parser = new X509CrlParser();\n X509Crl CRL = Parser.ReadCrl(File.ReadAllBytes(CRLFile));\n NextUpdate = CRL.NextUpdate.Value;\n var RevokedCerts = CRL.GetRevokedCertificates();\n\n foreach(X509CrlEntry entry in RevokedCerts)\n {\n //Target value (first SN in CRL): 16a03c2c000000000594\n\n string serialNumber = entry.SerialNumber.ToString();\n //serialNumber = "106847877515466973906324" (Nope)\n\n string serialFromBytes = Encoding.Default.GetString(entry.SerialNumber.ToByteArray());\n //serialFromBytes = "\\u0016\xc2\xa0<,\\0\\0\\0\\0\\u0005\xe2\x80\x9d" (That\'s a hard NO)\n\n string serialFromBigInt = entry.SerialNumber.LongValue.ToString("X");\n //serialFromBigInt = "3C2C000000000594" (OK, now we\'re getting somewhere!!)\n }\nRun Code Online (Sandbox Code Playgroud)\n\n因此,它看起来像LongValue.ToString FTW,但最后一个难题是如何导出序列号的前 2 个八位字节(“16 a0”)。正在寻找这方面的建议!
\n如果您只想将序列号作为十六进制字符串,BigInteger 有一个采用基数的 ToString 重载,例如:
string serialFromBigInt = entry.SerialNumber.ToString(16);
Run Code Online (Sandbox Code Playgroud)