官方的php sdk 里面并没有公钥证书签名的方法
function getSn($filepath, $isroot = false)
{
$fileData = file_get_contents($filepath);
if ($isroot) {
return getRootCertSN($fileData);
} else {
return getCertSN($fileData);
}
return $md5_str;
}
function getRootCertSN($str)
{
// return '687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6';
$arr = preg_split('/(?=-----BEGIN)/', $str, -1, PREG_SPLIT_NO_EMPTY);
$str = null;
foreach ($arr as $e) {
$sn = getCertSN($e, true);
if (!$sn) {
continue;
}
if ($str === null) {
$str = $sn;
} else {
$str .= '_' . $sn;
}
}
return $str;
}
function getCertSN($str, $matchAlgo = false)
{
/*
根据java SDK源码:AntCertificationUtil::getRootCertSN
对证书链中RSA的项目进行过滤(猜测是gm国密算法java抛错搞不定,故意略去)
java源码为:
if(c.getSigAlgOID().startsWith('1.2.840.113549.1.1'))
根据 https://www.alvestrand.no/objectid/1.2.840.113549.1.1.html
该OID为RSA算法系。
*/
if ($matchAlgo) {
openssl_x509_export($str, $out, false);
if (!preg_match('/Signature Algorithm:.*?RSA/im', $out, $m)) {
return;
}
}
$a = openssl_x509_parse($str);
$issuer = null;
// 注意:根据java代码输出,需要倒着排列 CN,OU,O
foreach ($a['issuer'] as $k => $v) {
if ($issuer === null) {
$issuer = '$k=$v';
} else {
$issuer = '$k=$v,' . $issuer;
}
}
# echo($issuer . $a['serialNumber'] . '\n');
$serialNumberHex = decimalNotation($a['serialNumberHex']);
$sn = md5($issuer . $serialNumberHex);
return $sn;
}
function decimalNotation($hex)
{
$dec = 0;
$len = strlen($hex);
for ($i = 1; $i
修复16进制转10进制问题
赞3
踩0