如何使用PHP读取或解析CRL(证书吊销列表)
PHP中无需外部命令解析CRL信息的方案
你之前使用的openssl_x509_parse()仅适用于X.509证书,无法解析证书吊销列表(CRL)。PHP的OpenSSL扩展提供了专门的openssl_crl_parse()函数,可直接解析PEM格式的CRL,无需调用外部openssl crl命令。
实现步骤
- 环境确认:
openssl_crl_parse()从PHP 5.2.0起可用,需确保OpenSSL扩展已启用(可通过phpinfo()查看状态)。 - 格式转换:使用你已有的
derToPem()函数,传入typeFonc="crl"参数生成符合标准的CRL PEM格式。 - CRL解析:调用
openssl_crl_parse()解析PEM格式的CRL,返回包含所有CRL字段的关联数组。 - 字段提取:从解析结果中提取签发者、更新时间等信息,时间戳可通过
date()转换为可读格式。
完整代码示例
function derToPem($contentFonc,$typeFonc="") { $response = ""; if($contentFonc!="") { $response = chunk_split(base64_encode($contentFonc), 64, "\n"); if($typeFonc!="crl") $response = "-----BEGIN CERTIFICATE-----\n".$response."-----END CERTIFICATE-----\n"; else $response = "-----BEGIN X509 CRL-----\n".$response."-----END X509 CRL-----\n"; } return $response; } // 自定义获取DER格式CRL的函数(替换为你的实际获取逻辑) $crlContentDer = extractLdapQueryForCRL(); // DER转PEM(指定类型为CRL) $crlContentPem = derToPem($crlContentDer, "crl"); // 解析CRL信息,失败时返回false $crlInfo = openssl_crl_parse($crlContentPem); if ($crlInfo === false) { die("CRL解析失败,请检查CRL格式是否合法"); } // 提取并处理目标字段 $issuer = $crlInfo['issuer']; $lastUpdate = date('Y-m-d H:i:s', $crlInfo['lastUpdate']); $nextUpdate = date('Y-m-d H:i:s', $crlInfo['nextUpdate']); // 输出示例 echo "签发者: " . $issuer . PHP_EOL; echo "上次更新时间: " . $lastUpdate . PHP_EOL; echo "下次更新时间: " . $nextUpdate . PHP_EOL; // 可选:遍历吊销的证书列表 if (!empty($crlInfo['revoked'])) { echo PHP_EOL . "吊销证书列表:" . PHP_EOL; foreach ($crlInfo['revoked'] as $revokedCert) { echo "证书序列号: " . $revokedCert['serialNumber'] . ", 吊销时间: " . date('Y-m-d H:i:s', $revokedCert['revocationDate']) . PHP_EOL; } }
解析结果说明
openssl_crl_parse()返回的数组包含以下关键字段:
issuer: CRL的签发者DN(区分名)lastUpdate: 上次更新时间的时间戳nextUpdate: 下次更新时间的时间戳revoked: 吊销证书的数组,每个元素包含serialNumber(证书序列号)和revocationDate(吊销时间戳)
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

