//处理参数 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; }