PHP中如何从X.509证书提取签名值?
提取X.509证书签名值的PHP解决方案
你可以使用PHP的openssl_x509_get_signature函数直接提取证书的签名信息,它会返回结构化的数组(而非纯字符串),包含签名值和对应的签名算法。
完整代码示例
// 你的证书内容 $certificate = '-----BEGIN CERTIFICATE----- MIIEvzCCBGSgAwIBAgITeAAARlJXpwVPUYDkbAABAABGUjAKBggqhkjOPQQDAjBi MRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxEzARBgoJkiaJk/IsZAEZFgNnb3YxFzAV BgoJkiaJk/IsZAEZFgdleHRnYXp0MRswGQYDVQQDExJQRVpFSU5WT0lDRVNDQTQt Q0EwHhcNMjQwNzAyMDMxMTE2WhcNMjYwNzAyMDMyMTE2WjBJMQswCQYDVQQGEwJT QTESMBAGA1UEChMJZnJlZSB0ZXh0MRIwEAYDVQQLEwlmcmVlIHRleHQxEjAQBgNV BAMTCWZyZWUgdGV4dDBWMBAGByqGSM49AgEGBSuBBAAKA0IABP/Lh6KN1Y5Z6CzW +3hLkwGLUyorKQoCCQZzrbtvHNLocvv7OFDUHZZiOnwzhavZLkOEPjH8ojIH1kb1 A4LsTEejggMTMIIDDzB+BgNVHREEdzB1pHMwcTEgMB4GA1UEBAwXMS1TaGFFa3wy LVNoYUVrfDMtU2hhRWsxHzAdBgoJkiaJk/IsZAEBDA8zMTExOTAyOTM3MDAwMDMx DTALBgNVBAwMBDExMDAxDjAMBgNVBBoMBWphemFuMQ0wCwYDVQQPDARUZWNoMB0G A1UdDgQWBBQJ9H6ej6E1lbOuT+RG6WI9yHrdATAfBgNVHSMEGDAWgBTHwOa3qd0S yk89bWiCliFF8wF1pDCB5QYDVR0fBIHdMIHaMIHXoIHUoIHRhoHObGRhcDovLy9D Tj1QRVpFSU5WT0lDRVNDQTQtQ0EoMSksQ049UFJaRUlOVk9JQ0VQS0k0LENOPUNE UCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25m Wd1cmF0aW9uLERDPWV4dHphdGNhLERDPWdvdixEQz1sb2NhbD9jZXJ0aWZpY2F0 ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9u UG9pbnQwgc4GCCsGAQUFBwEBBIHBMIG+MIG7BggrBgEFBQcwAoaBrmxkYXA6Ly8v Q049UEVaRUlOVk9JQ0VTQ0E0LUNBLENOPUFJQSxDTj1QdWJsaWMlMjBLZXklMjBT ZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWV4dHphdGNh LERDPWdvdixEQz1sb2NhbD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9 Y2VydGlmaWNhdGlvbkF1dGhvcml0eTAOBgNVHQ8BAf8EBAMCB4AwPAYJKwYBBAGC NxUHBC8wLQYlKwYBBAGCNxUIgYaoHYTQ+xKG7Z0kh877GdPAVWaBnNgtg+XFXQIB ZAIBEDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwMwJwYJKwYBBAGCNxUK BBowGDAKBggrBgEFBQcDAjAKBggrBgEFBQcDAzAKBggqhkjOPQQDAgNJADBGAiEA 2sVgVJidhX8lnKshVB4JL7YBY+F1p48JI7NPpO4xJDQCIQCWf97LYNEK7358msfA RK1iTp3om8fnJ33A59SurRjENA== -----END CERTIFICATE-----'; // 读取证书 $cert = openssl_x509_read($certificate); if (!$cert) { die('证书读取失败'); } // 获取签名信息 $signatureInfo = openssl_x509_get_signature($cert); if (!$signatureInfo) { die('获取签名失败'); } // 输出结构化结果 echo "签名算法OID: " . $signatureInfo['algorithm'] . "\n"; echo "原始二进制签名: " . $signatureInfo['signature'] . "\n"; // 转换为和证书中一致的Base64格式 echo "Base64编码签名: " . base64_encode($signatureInfo['signature']) . "\n"; // 释放证书资源 openssl_x509_free($cert);
关键说明
函数作用:
openssl_x509_get_signature专门用于提取X.509证书的签名信息,返回的关联数组包含两个核心字段:algorithm:签名使用的算法标识符(OID),你的证书使用的是1.2.840.10045.4.3.2(对应ECDSA-with-SHA256)signature:原始二进制格式的签名值,如果需要和PEM证书中显示的Base64格式一致,用base64_encode转换即可。
为什么之前的方法不行:
openssl_x509_export仅输出完整的PEM格式证书,签名是其中的一段字符串,无法直接结构化获取;openssl_x509_parse默认只解析证书的高层元数据(如主体、颁发者、有效期等),不包含签名这类底层结构信息。
内容的提问来源于stack exchange,提问作者momo
相关产品推荐
相关产品推荐

