【问题标题】:Trying to connect using ssh2_auth_pubkey_file()尝试使用 ssh2_auth_pubkey_file() 连接
【发布时间】:2021-02-03 12:46:26
【问题描述】:

我正在尝试制作一个在终端上运行的 php 脚本,该脚本将通过 ssh 连接到远程服务器并检索文件。这是我目前的代码

#!/usr/bin/php -q
<?php
$cwd = dirname(__FILE__).'/';
$filename = 'retrive-this.file';
$host = 'hostip';

$connection = ssh2_connect($host, 22, array('hostkey'=>'ssh-rsa'));
$methods = ssh2_auth_pubkey_file($connection, 'remoteuser',
                                 $cwd.'ssh/id_rsa.pub',
                                 $cwd.'ssh/id_rsa', "it's an inception");
var_dump($methods);

//ssh2_scp_recv($connection, "/remote/server/path/to/$filename", $cwd.$filename);
?>

现在我遇到了ssh2_auth_pubkey_file() 函数的问题,当我运行脚本时它会返回:

PHP Warning:  ssh2_auth_pubkey_file(): Authentication failed for remoteuser using public key in /home/tonyl/Projects/get-file-ssh.php on line 10
bool(false)

密钥文件的权限为-rw-r--r-- (644)。此外,公钥已经添加到远程用户的授权密钥中。我可以正常使用 ssh 命令进行 ssh,所以我认为这不是 ssh 授权问题,但谁知道呢。我是 ssh 和 ssh2 php 库的新手。

如果我在远程 sshd_config 文件中启用它,我可以使用 ssh2_auth_password() 进行连接,但我不想这样做,因为它会降低安全传输。

关于我能做什么的任何想法。

【问题讨论】:

  • 默认目录是.ssh,而不是ssh,这可能是问题所在吗? id_rsa 应该是 0600,由连接的用户拥有。
  • 如果这适用于命令行中的 ssh,如果不使用调试器进入 libssh2,这几乎是不可能调试的。您也可以先尝试使用 strace 运行 PHP,看看是否能找到可疑之处。
  • 我至少可以确认这是在公钥/私钥文件不存在时得到的确切错误消息。
  • 好吧,实际上所有的错误,所以事实上,你是对的,它很难调试。
  • @Wrikken ssh 文件夹在我的脚本文件夹中,我将密钥文件复制到那里以便它可以访问。如果它是一个 apache 网页,我猜运行它的用户会是 www-data,但由于它是一个命令行脚本,我猜用户是我呢?如果是这样的话,我可以访问。我将其更改为 0600 许可证,结果仍然相同。 @Artefacto 我有点害怕它可能会发生这种情况。我将通过跟踪@Wrikken 来查看是否可以获取更多信息。我认为这可能是问题所在,但我在脚本中回显文件的内容并且它可以读取它们。

标签: ssh php


【解决方案1】:

这是 php 中的一个已知错误:密码保护的私钥不能用于某些组合。

见:https://bugs.php.net/bug.php?id=58573

当公钥文件受到密码保护并且 libssh2 使用 libgcrypt 编译时,ssh2_auth_pubkey_file() 被破坏,这就是 debian/ubuntu 和其他人可能会做的事情。我正在为这个错误制定解决方案,但如果你需要这个工作,请使用 OpenSSL 自己重建 libssh2。

一种解决方法可能是存储未加密的私钥。 解密密钥:

openssl rsa -in id_rsa -out id_rsaNOPASSWORD

然后使用文件 id_rsaNOPASSWORD 而不提供第五个参数“密码”。 它可以工作,但你必须小心你的解密密钥文件。无论如何,安全级别并没有受到太大影响,因为即使使用加密密钥,您仍然需要将未加密的密码传递给 ssh2_auth_pubkey_file 函数...

希望对你有帮助。

【讨论】:

  • 你可以使用 phpseclib.sourceforge.net 。它不仅没有这个问题——它支持比 PHP 的 SSH 扩展更多的密钥格式——PuTTY、PKCS8、PKCS1、XML、密码、无密码等。
【解决方案2】:

这看起来像是这里的错误。 FILE 不是文件路径吗?所以它看起来像 /somedir/somefile.php 而你所做的只是在 .php 的末尾添加一个 / 所以我认为这不是真的有效。见http://www.php.net/manual/en/language.constants.predefined.php

$cwd = dirname(__FILE__).'/';

另外,其他人也遇到了 ssh2_auth_pubkey_file 的问题 在所有条件下都返回 false。您可能需要提交错误报告。我希望使用这个功能。我不知道如何使用它,因为我不知道如何提供私钥。

我认为你想要的代码是

if (!defined('__DIR__')) {
    $iPos = strrpos(__FILE__, "/");
    define("__DIR__", substr(__FILE__, 0, $iPos) . "/");
}
$cwd=__DIR__ . '/';

请记住,当涉及到远程目录时,您应该使用 ssh2_sftp_realpath()。

dirname() 已被报告为不可靠。

【讨论】:

  • 代码$cwd = dirname(__FILE__).'/'; 确实返回了正确的目录:/home/tonyl/Projects/ 我不认为这是问题所在,dirname() 也不是,因为我将它用于本地文件夹,而不是远程文件夹.不过感谢您的帮助,我想我会看看是否有关于 C 库或 PHP 的错误报告
  • 毫无疑问,只需像这样使用您的路径 -> /home/user/dir/ 因为问题不在于您的路径,而在于 ssh2_auth_pubkey_file php 函数。我在这里遇到了同样的问题
  • 你们找到解决方案了吗?我在这里遇到了同样的问题。您是使用secret 的密钥吗?如果是这样,一个可能导致此问题的候选人是错误bugs.php.net/bug.php?id=58573
【解决方案3】:

我已经使用此功能大约 3 年了,由于某种原因,我正在配置的新服务器无法正常工作。当我发现这个时,我正要从阳台上跳下来:

ssh-keygen -m PEM -t rsa -b 4096

使用@megar 多年前回答的链接。

希望对其他人有所帮助,这很难!

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-10-21
    相关资源
    最近更新 更多