You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:27:02