警告:openssl_pkcs7_sign():在Linux服务器上获取私钥时出错

A.B*_*per 2 php ssl

也许这是一个重复的问题,并在这个这个问题中被问到,但是这个问题似乎很具体。

我想连接到使用ssl证书的银行互联网支付系统,但遇到此错误:

Warning: openssl_pkcs7_sign(): error getting private key in /home/zarsamco/public_html/eghtesad/ipg/enpayment.php on line 52
Run Code Online (Sandbox Code Playgroud)

这是我的代码中使用证书文件的部分(在本地wamp上):

openssl_pkcs7_sign(realpath("msg.txt"), realpath("signed.txt"), "file://D:/wamp/www/zarsam/eghtesad/certs/ZarsamHonar.pem",
                array ("file://D:/wamp/www/zarsam/eghtesad/certs/ZarsamHonar.pem", "secretPass"),
                array (), PKCS7_NOSIGS
            );
Run Code Online (Sandbox Code Playgroud)

由于ZarsamHonar.pem的地址是绝对的,因此在本地(第8窗口)的wamp中工作正常 。但是,此代码在远程服务器(Linux)上不起作用,因为我认为这种地址方式特别适用于Windows。

我尝试了许多在网上找到的寻址方法以及相关的SO问题。
例如,我尝试下面的代码(enpayment.php页面):

$prepend = "file://";
openssl_pkcs7_sign(realpath(dirname(__FILE__)) . "../msg.txt",
realpath(dirname(__FILE__)) . "../signed.txt",
$prepend . realpath(dirname(__FILE__)) ."/certs/ZarsamHonar.pem",
array($prepend . realpath(dirname(__FILE__)) ."/certs/ZarsamHonar.pem", "secretPass"),array(), PKCS7_NOSIGS);
Run Code Online (Sandbox Code Playgroud)

但这也没有解决。

这是ZarsamHonar.pem,msg.txt和signed.txt文件的相关文件结构和位置的屏幕截图:

在此处输入图片说明

谁能帮我?

A.B*_*per 5

经过数小时的搜索,尝试使用不同的方法和指南@Sjon,当然还要根据该用户的意见对php.net进行评论后,我找到了解决方案。

最后的代码是:

openssl_pkcs7_sign(realpath("msg.txt"), "signed.txt",
                'file://'.realpath('/home/zarsamco/public_html/eghtesad/certs/zarsamhonar.pem'),
                array ('file://'.realpath('/home/zarsamco/public_html/eghtesad/certs/zarsamhonar.pem'), "secretPass"),
                array (), PKCS7_NOSIGS
            );  
Run Code Online (Sandbox Code Playgroud)

在第一个参数中必须使用realpath函数,但不要用于第二个参数。
因为它尚不存在。为了寻址第三和第四参数,必须使用绝对路径以及file://前缀。