Linux服务器上的OpenSSL目录很好 - 而不是在Windows XAMPP上

时间:2010-09-27 22:12:00

标签: php encryption ssl openssl xampp

我有一个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),操作也会失败。

编辑2

当我说“无法加密”时,我的意思是,返回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机器上的线路,但这仍然没有进行任何加密)。

1 个答案:

答案 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