如何从X509 Subject Public Key Info中提取原始pub公钥片段
公钥提取实现方案
以下方案均适配EC、RSA等多种类型的证书,可通用:
1. OpenSSL命令行实现
直接执行以下命令即可输出目标格式的原始公钥:
openssl x509 -in mycert.pem -text -noout | sed -n '/pub:/,/^[[:space:]]*[^[:space:]:]/p' | grep -v 'pub:' | sed 's/^[[:space:]]*//'
- 若需要去掉内容中的冒号,可在命令末尾追加
| tr -d ':' - 若需要去掉换行拼接为单行字符串,可继续追加
| tr -d '\n'
2. PHP基于openssl扩展实现
无需处理文本匹配,直接通过内置函数解析公钥结构,兼容性更强:
<?php // 读取PEM证书内容 $certContent = file_get_contents('mycert.pem'); // 解析证书并提取公钥实例 $certObj = openssl_x509_read($certContent); $pubKeyObj = openssl_pkey_get_public($certObj); $keyInfo = openssl_pkey_get_details($pubKeyObj); // 按密钥类型提取原始公钥二进制内容 if (isset($keyInfo['ec'])) { $rawPubBin = $keyInfo['ec']['pub_key']; } elseif (isset($keyInfo['rsa'])) { $rawPubBin = $keyInfo['rsa']['n']; } else { throw new Exception('不支持的密钥类型'); } // 转换为冒号分隔的十六进制格式 $hexStr = bin2hex($rawPubBin); $formatted = implode(':', str_split($hexStr, 2)); // 按openssl默认格式每行15组分隔 $result = implode(PHP_EOL, str_split($formatted, 47)); echo $result; ?>
3. PHP基于phpseclib实现(v3版本)
纯PHP实现,不依赖本地openssl环境,跨平台兼容性好:
<?php use phpseclib3\File\X509; require __DIR__ . '/vendor/autoload.php'; $x509 = new X509(); $x509->loadX509(file_get_contents('mycert.pem')); $pubKey = $x509->getPublicKey(); // 提取原始公钥并格式化 $hexStr = bin2hex($pubKey->toString('raw')); $formatted = implode(':', str_split($hexStr, 2)); $result = implode(PHP_EOL, str_split($formatted, 47)); echo $result; ?>
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

