在PHP's OpenSSL functions的补充评论中,有这个代码段
function pem2der($pem_data) {
$begin = "CERTIFICATE-----";
$end = "-----END";
$pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
$pem_data = substr($pem_data, 0, strpos($pem_data, $end));
$der = base64_decode($pem_data);
return $der;
}
function der2pem($der_data) {
$pem = chunk_split(base64_encode($der_data), 64, "\n");
$pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
return $pem;
}
这些功能不是反转的。我的测试代码:
$priv_key = ...;
print $priv; // dev data, of course
print der2pem (pem2der ($priv));
打印
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAAS... (etc)
然后
-----BEGIN CERTIFICATE-----
TEKEYMIIJQwIBADANBgkqhkiG9w0BAQEFA... (etc)
注意第二个具有TEKEY
前缀。在十六进制中,4c4284
看起来并不重要。
这是从哪里来的?
答案 0 :(得分:1)
这些功能仅用于处理证书,而不是私钥。结果错误的原因是pem2der
函数正在查找证书的开头(CERTIFICATE-----
来自-----BEGIN CERTIFICATE-----
)。您正在尝试解码以-----BEGIN PRIVATE KEY-----
开头的密钥。结果的“TE KEY”部分来自这里:“----- BEGIN PRIVA TE KEY -----”并且是不处理该标题的函数的结果所以{ {1}}调用返回错误的结果。
理论上,这些函数应该很容易修改以处理私钥文件。