我有一个php脚本,它会查找openssl目录并加密我拥有的客户数据。
当我将脚本上传到我的在线linux目录时 - 加密工作正常
#private key file to use
$MY_KEY_FILE = "my-prvkey.pem";
#public certificate file to use
$MY_CERT_FILE = "my-pubcert.pem";
# Paypal's public certificate
$PAYPAL_CERT_FILE = "paypal_cert_sandbox.pem";
# path to the openssl binary
$OPENSSL = "/usr/bin/openssl";
当我尝试在目前运行XAMPP的Windows机器上运行相同的命令时,我无法加密任何内容。还有其他人有这个问题吗?
我很乐意在本地更新和测试,而不是每次在构建期间进行更改时都要ftp文件。
我确实认识到上面的目录主要是针对linux;但是,即使我将目录指向XAMPP文件夹中的openssl目录(对于我:C:\ xampp \ apache \ bin),操作也会失败。
当我说“无法加密”时,我的意思是,返回NOTHING(即公钥显然没有找到openssl .dll文件),即使它们指向正确的目录。没有错误消息。配置差异?一个是linux服务器,一个是windows本地机。
在我的脚本中,我包含以下内容:
<?php
function paypal_encrypt($hash) {
global $MY_KEY_FILE;
global $MY_CERT_FILE;
global $PAYPAL_CERT_FILE;
global $OPENSSL;
if (!file_exists($MY_KEY_FILE)) {
echo "ERROR: MY_KEY_FILE $MY_KEY_FILE not found\n"; }
if (!file_exists($MY_CERT_FILE)) {
echo "ERROR: MY_CERT_FILE $MY_CERT_FILE not found\n"; }
if (!file_exists($PAYPAL_CERT_FILE)) {
echo "ERROR: PAYPAL_CERT_FILE $PAYPAL_CERT_FILE not found\n"; }
if (!file_exists($OPENSSL)) {
echo "ERROR: OPENSSL $OPENSSL not found\n"; }
$openssl_cmd = "$OPENSSL smime -sign -signer $MY_CERT_FILE -inkey $MY_KEY_FILE " . "-outform der -nodetach -binary | $OPENSSL smime -encrypt " . "-des3 -binary -outform pem $PAYPAL_CERT_FILE";
$descriptors = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), );
$process = proc_open($openssl_cmd, $descriptors, $pipes);
if (is_resource($process)) {
foreach ($hash as $key => $value) {
if ($value != "") {
fwrite($pipes[0], "$key=$value\n");
}
}
fflush($pipes[0]);
fclose($pipes[0]);
$output = "";
while (!feof($pipes[1])) {
$output .= fgets($pipes[1]); }
fclose($pipes[1]);
$return_value = proc_close($process);
return $output;
}
return "ERROR"; }
?>
在我的Windows机器和Linux机器上显示“错误:未找到OPENSSL”(即使在Linux托管服务器上,加密仍然完成)。我可以通过简单地放置C:\ xampp \ apache \ bin \ openssl.exe来删除我的Windows机器上的线路,但这仍然没有进行任何加密)。
答案 0 :(得分:1)
在脚本中放置Windows路径时,不要忘记转义反斜杠,否则它将被解释为转义字符。您可以在PHP for Windows中使用正斜杠。
在windows中指定openssl路径的两种方法:
$OPENSSL = 'C:\\xampp\\apache\\bin\\openssl.exe';
$OPENSSL = 'C:/xampp/apache/bin/openssl.exe';
PHP还有一个OpenSSL扩展:http://php.net/manual/en/book.openssl.php