在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,看起来并不重要。
这是从哪里来的?
发布于 2016-04-09 05:13:24
这些函数仅用于处理证书,而不是私钥。结果错误的原因是因为pem2der函数正在查找证书的起始位置(来自-----BEGIN CERTIFICATE-----的CERTIFICATE-----)。您正在尝试解码以-----BEGIN PRIVATE KEY-----开头的密钥。结果的"TE KEY“部分来自这里:”-BEGIN PRIVATE KEY-“,这是由于函数没有处理该标头,因此substr调用返回了错误的结果。
从理论上讲,这些函数应该很容易修改以处理私钥文件。
https://stackoverflow.com/questions/36503814
复制相似问题