mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
118 lines
4.4 KiB
PHP
118 lines
4.4 KiB
PHP
<?php
|
||
/**
|
||
* 调试密钥格式问题
|
||
*/
|
||
|
||
echo "\n========== 密钥格式调试 ==========\n\n";
|
||
|
||
$demoPrivateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAML7xXU6vpHofdrtOO6+gNrmTRb+eIQaDg37Q2eL4p/AdVfTmkjtB2rUnn6rfXI5ECiJJI1k1bi5bKSZ5KW0LaYcaRBcKVTgmYxedYXJEIQ3DWIMgggSw1rHiMUFlRoMKfr0/FaCnnDCT53RXtBFhn2OSBRokr4FJhrQoytrFV8nAgMBAAECgYEAizhN0thw/altQ4YiIoWvZ50M6iAkWN5prp37kNGWrM40etNB1FQ5+ZN636L+3THVUbwqdzLKTy1GX3jqg05VUIf0sKYYepp+skwZmHVprz4EUKsZXRa+3MnMChJcyHdlyuUNs6HriMq6Qc1+fFEOtZFAf3lo2wYNFw5vIKHGQRECQQDxVKa+6m4y7LmWgiGLYghuL/SGXySFhwBh5+zMNl8V7aAbTX/tH6A0s8JXsSI4iChjWPXthKFTrd7h62vJBjeFAkEAztXpNehF18g3e6JEhtjbTmMsgyj13gdSZSRwjO0Y+IsDI1afnZXzwv96OlukGK8185z0bsbhTCOd6rkcRTnduwJBAOqGknlMh4VTylO66PB0d67lSaPgCDT/al67LcOTPzqnMAX4fc6qAl3VJ5Ni39fCckWB6ZVGZCVW/hfdWmUEdqUCQFFWNXuJd82/YnIwAZq1tKhCv8JkXSuO3YwApHIG2wcCQ52l9ubVjSJlrP8+Am3imOjQFB9r/jUe3H7thHyEoPkCQCay3waa0ll2DY+epkrrF/QO7aMa6NIUArRgWUmqw+1/45csBiWPMUrAD/CPDUr9Jvte92NjoAlz649csbgMM3w=';
|
||
|
||
echo "原始私钥(BASE64):\n";
|
||
echo " 长度: " . strlen($demoPrivateKey) . " 字符\n";
|
||
echo " 前50字符: " . substr($demoPrivateKey, 0, 50) . "\n";
|
||
echo " 后50字符: " . substr($demoPrivateKey, -50) . "\n\n";
|
||
|
||
// 方法1:chunk_split
|
||
$pem1 = "-----BEGIN PRIVATE KEY-----\n";
|
||
$pem1 .= rtrim(chunk_split($demoPrivateKey, 64, "\n"), "\n") . "\n";
|
||
$pem1 .= "-----END PRIVATE KEY-----\n";
|
||
|
||
echo "【方法1】使用chunk_split:\n";
|
||
echo $pem1;
|
||
echo "\n尝试加载...\n";
|
||
$key1 = @openssl_pkey_get_private($pem1);
|
||
if ($key1) {
|
||
echo "✓ 成功加载!\n";
|
||
$details = openssl_pkey_get_details($key1);
|
||
echo " 密钥类型: " . $details['type'] . "\n";
|
||
echo " 密钥大小: " . $details['bits'] . " bits\n";
|
||
openssl_free_key($key1);
|
||
} else {
|
||
echo "✗ 加载失败: " . openssl_error_string() . "\n";
|
||
}
|
||
echo "\n";
|
||
|
||
// 方法2:wordwrap
|
||
$pem2 = "-----BEGIN PRIVATE KEY-----\n";
|
||
$pem2 .= wordwrap($demoPrivateKey, 64, "\n", true) . "\n";
|
||
$pem2 .= "-----END PRIVATE KEY-----\n";
|
||
|
||
echo "【方法2】使用wordwrap:\n";
|
||
echo $pem2;
|
||
echo "\n尝试加载...\n";
|
||
$key2 = @openssl_pkey_get_private($pem2);
|
||
if ($key2) {
|
||
echo "✓ 成功加载!\n";
|
||
$details = openssl_pkey_get_details($key2);
|
||
echo " 密钥类型: " . $details['type'] . "\n";
|
||
echo " 密钥大小: " . $details['bits'] . " bits\n";
|
||
openssl_free_key($key2);
|
||
} else {
|
||
echo "✗ 加载失败: " . openssl_error_string() . "\n";
|
||
}
|
||
echo "\n";
|
||
|
||
// 方法3:手动循环
|
||
$pem3 = "-----BEGIN PRIVATE KEY-----\n";
|
||
$offset = 0;
|
||
while ($offset < strlen($demoPrivateKey)) {
|
||
$pem3 .= substr($demoPrivateKey, $offset, 64) . "\n";
|
||
$offset += 64;
|
||
}
|
||
$pem3 .= "-----END PRIVATE KEY-----\n";
|
||
|
||
echo "【方法3】手动循环:\n";
|
||
echo $pem3;
|
||
echo "\n尝试加载...\n";
|
||
$key3 = @openssl_pkey_get_private($pem3);
|
||
if ($key3) {
|
||
echo "✓ 成功加载!\n";
|
||
$details = openssl_pkey_get_details($key3);
|
||
echo " 密钥类型: " . $details['type'] . "\n";
|
||
echo " 密钥大小: " . $details['bits'] . " bits\n";
|
||
openssl_free_key($key3);
|
||
} else {
|
||
echo "✗ 加载失败: " . openssl_error_string() . "\n";
|
||
}
|
||
echo "\n";
|
||
|
||
// 检查是否需要PKCS#1格式
|
||
echo "【方法4】尝试PKCS#1格式 (RSA PRIVATE KEY):\n";
|
||
$pem4 = "-----BEGIN RSA PRIVATE KEY-----\n";
|
||
$pem4 .= wordwrap($demoPrivateKey, 64, "\n", true) . "\n";
|
||
$pem4 .= "-----END RSA PRIVATE KEY-----\n";
|
||
|
||
echo $pem4;
|
||
echo "\n尝试加载...\n";
|
||
$key4 = @openssl_pkey_get_private($pem4);
|
||
if ($key4) {
|
||
echo "✓ 成功加载!\n";
|
||
$details = openssl_pkey_get_details($key4);
|
||
echo " 密钥类型: " . $details['type'] . "\n";
|
||
echo " 密钥大小: " . $details['bits'] . " bits\n";
|
||
openssl_free_key($key4);
|
||
} else {
|
||
echo "✗ 加载失败: " . openssl_error_string() . "\n";
|
||
}
|
||
echo "\n";
|
||
|
||
echo "========== 检查密钥格式特征 ==========\n\n";
|
||
|
||
// BASE64解码后检查二进制特征
|
||
$decoded = base64_decode($demoPrivateKey);
|
||
echo "解码后长度: " . strlen($decoded) . " bytes\n";
|
||
echo "前30字节(hex): " . bin2hex(substr($decoded, 0, 30)) . "\n\n";
|
||
|
||
// PKCS#8特征:开头应该是 30 82 ... (SEQUENCE)
|
||
// 并且包含 06 09 2a 86 48 86 f7 0d 01 01 01 (RSA OID)
|
||
$hex = bin2hex($decoded);
|
||
if (strpos($hex, '06092a864886f70d010101') !== false) {
|
||
echo "✓ 检测到PKCS#8格式特征 (包含RSA OID)\n";
|
||
echo " 应该使用: -----BEGIN PRIVATE KEY-----\n\n";
|
||
} else {
|
||
echo "✗ 未检测到PKCS#8特征\n";
|
||
echo " 可能是PKCS#1格式,应该使用: -----BEGIN RSA PRIVATE KEY-----\n\n";
|
||
}
|
||
|
||
echo "========== 调试完成 ==========\n\n";
|