.pfx证书文件的PHP使用——RSA验证机制

在写一个XX支付平台的时候遇到后缀为.pfx证书的问题的时候发现了一篇不错的博客,虽然最后没有用到,但是感觉写的真不错就转了

转载地址:https://www.jianshu.com/p/8b364f155e31

转载内容:

今天公司遇到一个支付项目 对方给过来的接口使用的是RSA验证 给到了一个.pfx的证书,顿时懵逼 马上问Google PHP RSA怎么玩的,结果网上都是一堆复制粘贴的东西 毫无营养。都说要什么转成.pem的文件形式才行,害得我搞了半天终于可以实现加密了,但是问题出现了,加密出来的字符串和接口提供方给过来的加密字符串示例不一样,明显是不通的。自己又是翻PHP帮助文档,又是瞎折腾 终于搞定了 很多支付类 银行接口都要用这种形式的验证 ,不多说 代码如下:

<?php
    /**
     * 生成签名前的字符串
     *
     * @param $params
     * @return string
     */
    function getParamsString($params)
    {
        if (!is_array($params))
            $params = array();
        ksort($params);
        $str = '';
        foreach ($params as $k => $v) {
            $str .= $v != ''?$k . $v:'';
        }
        return $str;
    }
/**
 * 根据原文生成签名内容
 *
 * @param string $data 原文内容
 *
 * @return string
 */
function sign($data)
{
    $filePath = 'private.pfx';
    if(!file_exists($filePath)) {
        return false;
    }
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '读取证书所需要的密码')) {
        $privateKey = $certs['pkey']; //根据实际情况键值可能不同
        $binary_signature = "";
        if (openssl_sign(utf8_encode($data), $binarySignature, $privateKey, OPENSSL_ALGO_SHA1)) {
            return bin2hex($binarySignature);
        } else {
            return '';
        }
    } else {
        return '';
    }
}
/**
 * 验证签名自己生成的是否正确
 *
 * @param string $data 签名的原文
 * @param string $signature 签名
 *
 * @return bool
 */
function verifySign($data, $signature)
{
    $filePath = 'private.pfx';
    if(!file_exists($filePath)) {
        return false;
    }

    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '读取证书所需要的密码')) {
        $publicKey = $certs['cert'];
        $ok = openssl_verify($data, hex2bin($signature), $publicKey);
        if ($ok == 1) {
            return true;
        }
    }
    return false;
}
/**
 * 验证返回的签名是否正确
 * @filePath 为cer文件路径
 * @param string $data 要验证的签名原文
 * @param string $signature 签名内容
 *
 * @return bool
 */
function verifyRespondSign($data, $signature)
{
    $filePath = 'public.cer';
    if(!file_exists($filePath)) {
        return false;
    }

    $cert = file_get_contents($filePath);
$$pubKeyId = openssl_get_publickey($cert);
    
    $signature = hex2bin($signature);
    $ok = openssl_verify(utf8_encode($data), $signature, $pubKeyId);

    if ($ok == 1) {
        openssl_free_key($pubkeyid);
        return true;
    }
    return false;
}
?>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值