`
王之子
  • 浏览: 105603 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

openssl 签名和验签不符的几个原因

阅读更多

先附上签名的代码

 

$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

  • 大小: 220.5 KB
  • 大小: 33.1 KB
  • 大小: 55.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics