pfx,cer轉pem,並對通過pem文件進行簽名與驗簽


  因為PHP無法讀取.pfx文件,所以可以先轉換為.pem文件然后在讀取里面的數據,可以讀取.cer文件,為了兩方面統一,就都換成.pem然后再進行加簽和驗簽。

sign.php

 1 <?php
 2 
 3 define("filePath","D:\\digitalCertificate\\");//.pfx和.cer文件放置的地址
 4 define("pfxFileName","jsc.pfx");//.pfx文件名
 5 define("password","abc123");//.pfx文件的密碼
 6 
 7 /*實現.pfx文件轉為.pem文件*/
 8 $file = filePath.pfxFileName;
 9 $results = array();
10 $worked = openssl_pkcs12_read(file_get_contents($file), $results, password);
11 $certificateCApem =$file.'.pem';
12 @file_put_contents($certificateCApem, $results);
13 
14 /*實現對傳來的數據進行排序*/
15 function dataSort($data) {
16     $dataArr=explode(";",$data);
17     sort($dataArr);
18     $dataStr=implode(',',$dataArr);
19     $TransData=str_replace(",","&",$dataStr);
20     return  $TransData;
21 }
22 
23 /*實現加簽功能*/
24 function sign($data) {
25     $priKey = file_get_contents(filePath.pfxFileName.'.pem');
26     $res = openssl_get_privatekey($priKey);
27     openssl_sign($data, $sign, $res);
28     openssl_free_key($res);
29     $sign = base64_encode($sign);
30     return $sign;
31 }
32 
33 $data="";//用戶傳進的要加簽的數據,中間每個參數用';'分隔開
34 // $data="name=amdin;code=12313;pass=admin;email=admin@qq.com;id=25536"; //測試用的$data數據
35 
36 $dataReturn=dataSort($data).'&'.'signType="RSA"'.'&'.'sign='.sign(dataSort($data));//業務需求需要返回的數據格式,使用者可根據實際需要改變
37 print_r($dataReturn);//生成加簽后的數據

 

signCheck.php

 1 <?php
 2 
 3 define("filePath","D:\\digitalCertificate\\");//.pfx和.cer文件放置的地址
 4 define("cerFileName","jsc.cer");//.cer文件名
 5 
 6 /*實現.cer文件轉為.pem文件*/
 7 $certificateCAcer = filePath.cerFileName;
 8 $certificateCAcerContent = file_get_contents($certificateCAcer);
 9 $certificateCApem=filePath.cerFileName.'.pem';
10 file_put_contents($certificateCApem,$certificateCAcerContent);
11 
12 /*實現傳來的數據進行排序*/
13 function dataSort($data) {
14     $dataArr=explode(";",$data);
15     sort($dataArr);
16     $dataStr=implode(',',$dataArr);
17     $TransData=str_replace(",","&",$dataStr);
18     return  $TransData;
19 }
20 
21 /*實現驗簽功能*/
22 function verify($data, $sign)  {
23     $pubKey = file_get_contents(filePath.cerFileName.'.pem');
24     $res = openssl_get_publickey($pubKey);
25     $result = (bool)openssl_verify($data, base64_decode($sign), $res);
26     openssl_free_key($res);
27     if($result) {
28         return "true";
29     }else {
30         return "false";
31     }
32 }
33 $signData='';//用戶實現驗簽是傳進的參數,不能修改為雙引號,因為用戶傳進的參數內部含有雙引號
34 
35 // $signData='code=12313&email=admin@qq.com&id=25536&name=amdin&pass=admin&signType="RSA"&sign=LLYTYTDzoehSCIoRLreVMYeBnlpB6ESVZ29VsvrYwhTPXJ0OzNlMs3t3L+FoqULwe9+p3mmY1YFqk8g4oOZzUpblrt0xEE6qDBakvSJDmoBsQi3CHRxcXtxiMcZO4w/JFPnj0ld6DfeNPsjg43OjLA7sgBGc3jj2eb/3KpsL/yAXziXJdrfdRKfXsIejxrsLQna7UwxaBZKeyY48ZYTJgMUX9dQemRHOe3lcJkGUJTJuKRjykwvXWQmoZJIvu/DBrQ9vJIIZOUOMDCPC3QQJrtZsxr1uNssZ6NlV/eVhKbFPEjZeCm+53RNsfirl12GCtv68eQC0CpVUEwuw4kLkNA==';//測試時sign.php中生成的加簽數據
36 
37 $data=explode('&signType="RSA"&sign=',$signData)[0];
38 $sign=explode('&signType="RSA"&sign=',$signData)[1];
39 
40 echo (verify(dataSort($data),$sign)); //返回驗簽結果,成功則為true,否則為false

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM