//处理参数
function MakeSign_Params( $arr ) {
ksort( $arr );
//按字典序排序参数
$buff = '';
foreach ( $arr as $k => $v ) {
if ( $k != 'signValue' ) {
$buff .= $k . '=' . $v . '&';
}
}
$buff = trim( $buff, '&' );
return $buff;
}
//生成 sha256WithRSA 签名
function getSign( $content ) {
$filePath = 'test-pfx.pfx';
if ( !file_exists( $filePath ) ) {
return false;
}
$pkcs12 = file_get_contents( $filePath );
if ( openssl_pkcs12_read( $pkcs12, $certs, '000000' ) ) {
$pkey = $certs['pkey'];
$pi_key = openssl_pkey_get_private($pkey);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id,别名函数openssl_get_privatekey
if(!$pi_key){
//var_dump($pi_key);
return false;
}
//print_r($certs); 可以查看里面是啥
//根据实际情况键值可能不同
//最后一个参数签名算法还有其他值OPENSSL_ALGO_SHA1
openssl_sign( $content, $signature, $pkey, 'SHA256' );
openssl_free_key($pi_key);
$sign = base64_encode( $signature );
return $sign;
}
}
//验证 sha256WithRSA 签名
function verify( $content, $sign ) {
$publicKey = file_get_contents( 'xdzf_cfca_prd.cer' ); //验证接口方传过来数据用使用这个公钥,使用这个。
$pu_key = openssl_pkey_get_public($publicKey);//这个函数可用来判断公钥是否是可用的,可用返回资源id Resource id
if(!$pu_key){
//var_dump( $pu_key);
return false;
}
$key = openssl_get_publickey( $publicKey ); //返回资源型Resource id #9,和上面函数openssl_pkey_get_public,效果一致
$ok = openssl_verify( $content, base64_decode($sign) , $key, 'SHA256' );
openssl_free_key( $key);
return $ok;
}