openssl 签名和验签不符的几个原因
程序员文章站
2022-06-11 13:18:17
...
先附上签名的代码
$privateKeyFile = '/data/private.pem'; $password = '123456'; $privateKey = file_get_contents($privateKeyFile); $pKeyId = openssl_pkey_get_private($privateKey, $password); openssl_sign($xmlSignSrc, $signature, $pKeyId); openssl_free_key($pKeyId); $signature = bin2hex($signature);
先附上验签的代码
public function verifyStr($orgStr,$signature){ echo '签名原文:'.$orgStr; $pubKeyId = openssl_get_publickey(file_get_contents($certFile)); $flag = (bool) openssl_verify($orgStr, hex2bin($signature), $pubKeyId); openssl_free_key($pubKeyId); if ($flag) { echo '<br/>Verified: <font color=red>SUCC</font>.'; return TRUE; } else { echo '<br/>Verified: <font color=red>Failed</font>.'; return FALSE; } }
生成私钥
openssl genrsa -out rsa_private_key.pem 1024
生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
首先要保证证书是 pem 格式的,用记事本打开如以下格式:
如果打开的是乱码,说明不是pem格式的证书,要把它转换成 pem 格式,举个例子:如果是 cer 格式,转换命令如下:
openssl x509 -inform DER -in allinpay-pds.cer -out allinpay-pds.pem
如果是 p12 格式证书转换,则有多种可能,得出的是两个稍有不同的代码
openssl pkcs12 -clcerts -nokeys -out cer.pem -in 20058100001485304.p12
openssl pkcs12 -clcerts -nodes -out cer.pem -in 20058100001485304.p12
如果PHP版本低于 php 5.4.1 ,请用 hextobin 替代 hex2bin 函数
具体证书转换流程,可借助搜索引擎研究下。另外,验签出错可能还和你的域名有关。
补充点SSL证书的知识:https://help.aliyun.com/knowledge_detail/42216.html
上一篇: 上海宝付Jmeter如何对数据库进行操作