
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签名及验签?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1250762.html
微信扫一扫
支付宝扫一扫