字符串的密钥怎么转为pem文件

发布时间:2020-03-08 19:03:11 浏览数:20

前几日对接支付宝相关接口时遇到一个问题,根据官方提示操作获得的公钥和密钥都是字符串,但是php用的时候确是要转为pem格式的,直接把字符串保存为pem文件是错误的。 百度搜了好久才找到方法,原来pem格式的密钥和公钥有专门的格式才可以,pem格式以64位长度换行分割,前后分别加上公私钥分割标志来生成。虽然本文的名称可能不是很严谨的表达本文的内容,却是我当初百度之后发现有一些朋友的搜索词,希望能看到这个来解决问题吧.

代码如下:

$publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo6jiR3nv2EvP4RG3DpDuJD3X6O4b24ljPOPmb2hGJPEEM94/SLjZlMbgr40Krii1Skf8lnh9y8hifk1+Re0vrMMCssLizX6EQkp3wunibB99ch4qq7P6TdLvIePj6joWAz5jnvsYYefRlXDzTsX/5jvuHAkS6u7W2Z4vZaNWcUIBVBWjlydgcQ29cVtIaoaGcDMTOfx3MVjU+mBQoK0p5aVfBbqEU0w9uKIWIp+U8GuQUiZANH6Msfdmg9OcJegfHaeUp4YbIzcp5I3veenHlfbKaaQ50DmKyOUkq9GAes5hFpvNtuLYbSzw7h/D4OWRcnjF2uyA8Q/vVzd1CPpM1wIDAQAB';
$privateKey = 'MIIEpAIBAAKCAQEAtDT8DOpezxA0yGF2vwzz7ULRI/TIAqqCjYhQALmCPhKrOjgec+Suj+pCzZGd1oRJ+IXx9qXLl2z8pLcLhoiLkKGLLtHnQkMnuwR9EIlNMaUO4fBNC7BF7CeiWRHKSlG16H0ct7lfKDEAypIieQH2avG9sPeugtYplwdcLGrf22Zay4Jnxzg+yv/BllRNb6Mxxb657QvmISvLj+Mpf259NXoP/Ecnb92rHEMopQ4tFObQ6QywhsnkcWbhSMUYgmNmgfqUh7bP0Uhr5yLLOPODAeLAeNLE+tLIcAD3LnZxKCUM0nYSWO7zrX5AObjuYG+GmM0EN2pkjGzUOczMClVfJwIDAQABAoIBABfUMcgbbbH/uJsOmD8nHVIwVatlgNUpat4AOmP+I8TFfzLRnOVCRfrtxSudp7tn/sgIHji5L7S0SqwVMEb340yar+bfBq9yZdyK+WaoYTbBVrh1qBp1kqlpjEQu4Ar3xxAZCyUYNAcCg9JFhJ1vrv/xO14dQkw2uYUpCf0tnLBMHXycdp4uHPBc0OpY/1wGCZCJq/fnncFNRRBfHHfFW91cASmqWQKnw7V7fu+xHbxoWHashYY9RKpb8ukrV2/bvbdiz37aHvThEdXw9D0bJ15GpegPN2f5WaK8Ic/gnRSATXmG5qddTqrZ0HAQ+iYmmzkc/IckVCvL0eNJX7LLTJECgYEA7RwPsyemA1Ox/IaIEp7w9x1vfQQw/TEsI+pWE6K1of02jXlg7icQmdvTR3aU6nPw7AHHlIHZU5KKanQEuxjJeD+9xxk5KYHQ2UzuPDQaaRRXZV9aqQ9vCEsjdDY7nI61THUpfTrbM6WXAqk0C5jeX6qnDZoiWoVmQZkPGW48k3sCgYEAwpBfaKAj9AXBpl0ycwfWR+8Ndx4Ka+TcbndnP5tS85llwvqc4jpNni7pz7eox1b89UxFKaUG7lkzZQO2t3num2Sqm99J5mJfVAFWlZNAmRaL4dfqJu68JeE5TtwJDjrdhodao3do05UI4PzGC93vwo8jnFWH/FEdNdZZhoevLUUCgYEAqZdnl1GliT2k0aT70K3EVkvEgVutGnvAQZQLqxG27j0pdrk5Xj2svw+fJ78mNidlS7jeIldZtU/cFtYSyCurdonI2I4u94Q1eCdxQrhVp5D4DbbNJpy2Yu0zV5yuuITOIfivCzY8sM0gnLOfWSgm7bAmujDjn3FIuWSbiynww98CgYEAoW66ywu8aRdxosDHQCxrfgn6KTCSww0EXN/TmjIdNKO9jHb2PrrTdgFE3KVtc+BYSIt9A127D36RpynarAeOk/6FlIlDPtW2dPQbTEX+nkbXz46f6KfDEsb6DtWA6f6rmZiq+uDz6EJLOKpjBKuj6NFtYaSSDSecTfRJGddw4OUCgYA99/yqbG0Zy9EOkb45kWes5lAU8lKoSoB8mVWm0gPhQJPOryaswqmgemwwRqHXBxnochCWyr3stqD7sf7q1t41JDJW7KEU9oU8mnLnewciblVrTIqBJT/FuLMTJs3vzefDhhX4mR/JIFV8RnnJdYTTDyThguPTE/ZqyIznVJv87A==';

//生成公钥
$pubPem = chunk_split($publicKey,64,"\n");
$pubPem = "-----BEGIN PUBLIC KEY-----\n" . $pubPem . "-----END PUBLIC KEY-----\n";
$pu_key = openssl_pkey_get_public($pubPem);
if ($pu_key){
    $create = file_put_contents('public.pem', $pubPem);
    if ($create){
        echo '生成公钥成功'."\n";
    }else{
        echo '生成公钥失败'."\n";
    }
}else{
    echo '公钥格式不正确'."\n";
}
//生成私钥
$priPem = chunk_split($privateKey,64,"\n");
$priPem = "-----BEGIN RSA PRIVATE KEY-----\n" . $priPem . "-----END RSA PRIVATE KEY-----\n";
$pi_key = openssl_pkey_get_private($priPem);
if ($pi_key){
    $create = file_put_contents('private.pem', $priPem);
    if ($create){
        echo '生成私钥成功'."\n";
    }else{
        echo '生成私钥失败'."\n";
    }
}else{
    echo '私钥格式不正确'."\n";
}

执行之后会在所在文件夹生成private.pem和public.pem文件

原文转自:http://www.jeeinn.com/2019/01/720/ ,原文的代码倒数第二行写错了