【问题标题】:PHP ssh2_auth_pubkey_file(): Authentication failed using public key: Invalid key data, not base64 encodedPHP ssh2_auth_pubkey_file():使用公钥验证失败:密钥数据无效,不是 base64 编码
【发布时间】:2012-06-13 01:29:02
【问题描述】:

在 PHP5.3.3(在 CentOS 和 apache2 上)我试图通过 php 脚本连接到 SFTP。该代码从构造函数中获取密钥和服务器详细信息

function __construct(){
    $this->host     = 'servername.loc';
    $this->port     = SFTP_PORT;
    $this->auth_user    = 'username';
    $this->auth_pub     = '/data/home/username/.ssh/id_rsa.pub';
    $this->auth_priv    = '/data/home/username/.ssh/id_rsa';
    $this->auth_pass    = null;
    $this->connection   = null;
}

并使用这些详细信息来创建连接。

    private function connect(){
    if (!($this->connection = ssh2_connect($this->host, $this->port))) {
        $this->response  = array('code' => "20",
                                 "message" => "Error connecting to SFTP server.");
        return false;
    }
    if (!ssh2_auth_pubkey_file($this->connection, $this->auth_user, $this->auth_pub,
                                $this->auth_priv, $this->auth_pass)) {
        $this->response  = array('code' => "40",
                                 "message" => "Error authenticating to SFTP server with key.");
        $this->disconnect();
        return false;
    }
}

我得到的结果是调用ssh2_auth_pubkey_file()时出错。

错误是:

ssh2_auth_pubkey_file():使用公钥对 USERNAME 进行身份验证失败:密钥数据无效,未经过 base64 编码

密钥上没有密码,我可以通过 CLI ssh 使用这些密钥手动连接到服务器。

我被难住了。我需要以某种方式对密钥进行编码吗?有什么建议吗?

【问题讨论】:

  • 嗯,它数字化了,我在公开提问后找到了答案。在另一个带有 dev cmets 的站点上找到了这个。 d23d23 at gmail dot com 说: “公钥必须在一行上,以密钥类型开头,1 个空格,后跟 keydata(没有换行符),后面不能跟 cmets。这个是 libssh2 的限制,因此请在使用您的密钥生成工具创建文件后从文件中删除任何多余的数据。” 因此,即使我使用 openssl 创建私钥和公钥,我也必须对其进行编辑以放置如上所述,所有这些都与密钥类型放在一行上。谢谢。 Unkul Munki

标签: php ssh


【解决方案1】:

您提到的先决条件,即 pubkey 文件没有任何 cmets 甚至没有尾随换行符是不正确的(当您仔细考虑时,换行符是荒谬的)。

如果你的脚本失败了,你就有问题了。很快偶然发现了 ssh2 错误,它在编译 wuth libgcrypt 而不是 openssl 时导致 ssh2 失败。解决方法是使用 openssl 以 PEM 格式创建您的私钥文件的 PEM 格式副本:

~/.ssh> openssl rsa -in id_rsa -out id_rsa.pem

然后,在您的 PHP 脚本中的 ssh2_auth_pubkey_file() 中,使用 id_rsa.pem 作为私钥文件而不是 id_rsa,并省略密码。 那应该可以正常工作。

【讨论】:

  • 感谢您的提示。浪费了 2 个小时试图解决这个笑话。
  • 在到处搜索之后,这种 openssl 到 .pem 的方法是行之有效的一件事。由于某种原因,直接将 ssh-keygen 重新格式化为 ossh 失败了。万分感谢。如果我能对此投票一百次,我会的。
  • 谢谢。这解决了我今天的问题。
【解决方案2】:

好吧,它数字化了,我在公开提问后找到了答案。在另一个带有 dev cmets 的网站上找到了这个。

d23d23 at gmail dot com 说: "公钥必须在一行上,以密钥类型开头,1 个空格,后跟 keydata(没有换行符),后面不能跟 cmets。这是 libssh2 的限制,因此请从文件中删除任何多余的数据使用您的密钥生成工具创建后。”

因此,即使我使用 openssl 创建了私钥和公钥,我也必须对其进行编辑,以将其与上述密钥类型放在一行中。谢谢。

【讨论】:

  • 顺便说一句。现在一切正常。连接,上传,mkdir,作品。
猜你喜欢
  • 2015-02-23
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多