如何提取PEM格式X509 CRL中的吊销证书序列号(C#/命令行)
提取PEM格式CRL中吊销证书序列号的方案
一、命令行实现(基于OpenSSL)
Linux/macOS 命令
openssl crl -in your_crl.pem -text -noout | grep -E "Serial Number:" | awk '{print $3}'
- 说明:
openssl crl -in your_crl.pem -text -noout:将PEM格式CRL转换为可读文本格式,不输出CRL本身grep -E "Serial Number:":过滤出包含吊销证书序列号的行awk '{print $3}':提取每行中的序列号部分
Windows PowerShell 命令
openssl crl -in your_crl.pem -text -noout | Select-String "Serial Number:" | ForEach-Object { $_.Line.Split()[2] }
- 说明:
Select-String "Serial Number:":匹配包含序列号的行ForEach-Object { $_.Line.Split()[2] }:拆分每行文本并提取序列号
二、C#代码实现
方案1:使用.NET内置类库(无需第三方包)
using System; using System.Security.Cryptography.X509Certificates; class CrlSerialExtractor { static void Main(string[] args) { string crlPath = "your_crl.pem"; // 加载PEM格式CRL using var crl = new X509Certificate2Collection(); crl.ImportFromPemFile(crlPath); if (crl.Count == 0) { Console.WriteLine("未加载到有效CRL"); return; } var x509Crl = (X509CRL)crl[0]; // 遍历所有吊销条目,提取序列号 foreach (var revokedEntry in x509Crl.RevokedCertificates) { // 将序列号转换为十六进制字符串(大写) string serialHex = BitConverter.ToString(revokedEntry.SerialNumber).Replace("-", "").ToUpper(); Console.WriteLine(serialHex); } } }
- 说明:
- 需要.NET 5及以上版本,
ImportFromPemFile是.NET 5新增方法 X509CRL.RevokedCertificates返回所有吊销证书的条目集合,每个条目包含SerialNumber字节数组,转换为十六进制字符串即可得到对应序列号
- 需要.NET 5及以上版本,
方案2:使用BouncyCastle库
先通过NuGet安装BouncyCastle.Cryptography包,然后使用以下代码:
using System; using Org.BouncyCastle.X509; using System.IO; class BouncyCastleCrlExtractor { static void Main(string[] args) { string crlPath = "your_crl.pem"; // 读取PEM文件内容 string pemContent = File.ReadAllText(crlPath); // 解析PEM格式CRL var crlParser = new X509CrlParser(); X509Crl crl = crlParser.ReadCrl(pemContent); // 获取所有吊销条目 var revokedEntries = crl.GetRevokedCertificates(); foreach (X509CrlEntry entry in revokedEntries) { // 提取序列号并转换为十六进制字符串 string serialHex = entry.SerialNumber.ToString(16).ToUpper(); Console.WriteLine(serialHex); } } }
- 说明:
X509Crl.GetRevokedCertificates()方法可直接获取所有吊销证书条目集合,之前你可能没注意到这个方法- 每个
X509CrlEntry的SerialNumber是BigInteger类型,调用ToString(16)即可得到十六进制序列号
内容的提问来源于stack exchange,提问作者Claus Appel
相关产品推荐
相关产品推荐

