最近做银联手机充值的一套东西,客户端服务器端一起做,好累呀。对方给了两个 证书,A.p12 和 B.cer。A.p12中的私钥很容易可以得到,但是B.cer中的公钥却怎么都拿不到,害我查了大半天。。。
原来 .p12中也有公钥。。。。
从p12中取密钥:
$p12cert = array();
$file = "cert/A.p12";
$fd = fopen($file, 'r');
$p12buf = fread($fd, filesize($file));
fclose($fd);
openssl_pkcs12_read($p12buf, $p12cert, password) ;
然后取就可以了。。
说说从a.cer中取公钥,这还是同事帮忙查到的。
其实就是做了一下编码转换而已。。。。
cer证书是二进制编码的,所以获取到它的内容后做次转码就可以啦。
cer证书由p12导出(只不过cer是二进制,p12是base64,可以网上查der(二进制)转pem(base64)),导出命令:
keytool -export -alias p12client -keystore dlt.p12 -storetype PKCS12 -storepass 密码 -rfc -file p12.cer
读取cer公钥如下所示:
function pem2der($pem_data) {
$begin = "KEY-----";
$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 PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
return $pem;
}
$file = "898000000000001.cer";
$fd = fopen($file, 'r');
$p12buf = fread($fd, filesize($file));
var_dump(der2pem($p12buf));-----------------------:这里调用 der2pem 、pem2der 都可以,两种方式。
明天还要加油干活!