提供PHP函数ssh2_auth_pubkey_file,私钥为字符串,而不是文件

时间:2017-06-30 17:10:55

标签: php

我正在尝试将包含RSA私钥文件内容的字符串传递给PHP函数ssh2_auth_pubkey_file

我的功能如下:ssh2_auth_pubkey_file($connection, $ssh_auth_user, $ssh_auth_pub, $ssh_auth_priv, $ssh_auth_pass)

我的问题是string $pubkeyfile我的函数是$ssh_auth_priv参数。当我提供一个指向文件的指针(例如'private.pem')时,一切正常,但是当我将文件的内容作为字符串传递时,我得到错误。

  • $ssh_auth_priv = 'private.pem';正常工作

我试过了:

  • $ssh_auth_priv = "-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA6Gfo+vYawTT6afHSxBeMYx/s/5nsMHmdckTUj5wPNdG2LhPX ywGGzyRB9qFAIJAaGmT9fPcgt/IIySOOqzvLGPXbdk15HW71FC8nVQmBYrQXWQnB ........ i3pcqQ2JwSgi9M6rVxDSHQrVVBhiXvAx7Q2B/TEf1BvhtxXdSntUUu63U13VGiOF 1J5RW3EjAeamKOEpaL75xQSSFZdqc7KUG6+cqejhyNkZ4oDk7x+gjuU= -----END RSA PRIVATE KEY----- ";不起作用
  • $ssh_auth_priv = <<<KEY-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA6Gfo+vYawTT6afHSxBeMYx/s/5nsMHmdckTUj5wPNdG2LhPX ywGGzyRB9qFAIJAaGmT9fPcgt/IIySOOqzvLGPXbdk15HW71FC8nVQmBYrQXWQnB ........ i3pcqQ2JwSgi9M6rVxDSHQrVVBhiXvAx7Q2B/TEf1BvhtxXdSntUUu63U13VGiOF 1J5RW3EjAeamKOEpaL75xQSSFZdqc7KUG6+cqejhyNkZ4oDk7x+gjuU= -----END RSA PRIVATE KEY----- KEY; Heredoc不起作用
  • 我尝试了file_get_contents字符串,但没有用。

我的问题是如何将公钥作为字符串传递,而不是指向文件的指针。

2 个答案:

答案 0 :(得分:0)

您不能为公钥文件名参数传递字符串,它必须是文件名。该功能以这种方式定义。

答案 1 :(得分:0)

您需要将私钥写入临时文件,并将该临时文件的名称提供给ssh2_auth_pubkey_file(),例如:

$session = ssh2_connect($host, $port, ['hostkey' => 'ssh-rsa']);
$tempPrivateKeyFileName = tempnam(sys_get_temp_dir(), 'id_rsa');
$fp = fopen($tempPrivateKeyFileName, 'wb+');
fwrite($fp, $yourPrivateKeyContents);
ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $tempPrivateKeyFileName, $passphrase);
unlink($tempPrivateKeyFileName);

值得注意的是,将私钥写到文件中可能会被其他进程读取,这取决于您的应用程序和环境,可能会有风险。至少您可能要确保使用密码对私钥进行加密。您可能还希望添加一个关闭处理程序,以确保在进程异常退出时删除临时文件。例如:

register_shutdown_function(static function () use ($tempPrivateKeyFileName) {
    if (file_exists($tempPrivateKeyFileName)) {
        unlink($tempPrivateKeyFileName);
    }
});
相关问题