
pkcs7signature php实现解读
在对接第三方接口时,需要用到pkcs7signature加签验证,那么如何在php中实现这个功能呢?
php中可以使用openssl_pkcs7_verify函数进行验签,最后一个参数需要设置成832。另外,需要对请求数据进行升序排序(asort($argarr, sort_string)),才能保证加签后的值和java端一致。
具体实现代码如下:
立即学习“PHP免费学习笔记(深入)”;
/**
* 加签
* @param string $str 字符串(sortSign($argArr))
* @param string $pre 生成文件干扰字符串UID
* @return string
*/
public static function pkcs7Sign($str, $pre = 'tmp')
{
$pre = uniqid($pre);
$pkcs12 = file_get_contents('PTNRtest.pfx');
openssl_pkcs12_read($pkcs12, $certs, 'mima');
$dataFile = RUNTIME_PATH . $pre . 'dataTxt.txt';
$myfile = fopen($dataFile, "w") or die("Unable to open file!");//将要签名的参数写入文件中
fwrite($myfile, $str);
fclose($myfile);
$signFile = RUNTIME_PATH . $pre . 'sign.txt';
openssl_pkcs7_sign($dataFile, $signFile, $certs['cert'], $certs['pkey'], null, PKCS7_DETACHED | 0x200 | 0x100);
$sign = self::smimeToSign(file_get_contents($signFile));
unlink($dataFile);
unlink($signFile);
return $sign;
}
/**
* 把S/MIME格式数据格式成签名数据
* @param string $smime S/MIME格式数据
* @return string
*/
public static function smimeToSign($smime)
{
$prefix = "||";
$smime = str_replace("\n", $prefix, trim($smime));
$tmpData = [];
preg_match_all("/\|{4}(.*)\|{4}/Ui", trim($smime), $tmpData);
if (isset($tmpData[1][1])) {
$smime = str_replace("||", "", $tmpData[1][1]);
} else {
$smime = "";
}
return $smime;
}
/**
* 加签数据值升序
* @param array $argArr 请求数据
* @return string
*/
public static function sortSign($argArr)
{
$tmp = [];
foreach ($argArr as $key => $val) {
if (in_array($key, ['SIGN_INFO'])) continue;
$tmp[] = $val;
}
asort($tmp, SORT_STRING);
return implode('', $tmp);
}以上就是PHP中如何实现PKCS7Signature签名及验签?的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号