【问题标题】:Why does PHP's ssh2_auth_pubkey_file require a public key?为什么 PHP 的 ssh2_auth_pubkey_file 需要公钥?
【发布时间】:2020-07-06 02:55:30
【问题描述】:

我可以通过命令行仅使用私钥登录服务器。为什么这个 PHP 函数也需要公钥?

$connection = ssh2_connect($server_address, $port, array('hostkey'=>'ssh-rsa'));
if (!@ssh2_auth_pubkey_file($connection, $username, $public_key_path, $private_key_path, $password))
{
  echo '<h3 class="error">Unable to authenticate. Check ssh key pair.</h3>';
  break;
}
echo '<h3 class="success">Authenticated.</h3>';

我正在编写个人使用测试脚本,以在调整和部署新服务器时检查防火墙设置和访问权限。我主要只是好奇,因为这似乎表明我缺少一些关于 ssh 如何工作的信息。但我也很恼火,因为我必须提供两条路径,而我似乎只需要一条路径。

【问题讨论】:

    标签: php ssh ssh-keys


    【解决方案1】:

    我没有直接使用 PHP SSH2 函数的经验。但是 PHP ssh2_auth_pubkey_file 内部调用了 libssh2_userauth_publickey_fromfile_ex from libssh2,其文档中提到了 publickey 参数:

    公钥文件的路径名。 (例如/etc/ssh/hostkey.pub)。 如果 libssh2 是针对 OpenSSL 构建的,则此选项 可以设置为NULL。

    所以也许你可以在 PHP 中传递null(因为 PHP 是针对 OpenSSL 构建的)。 如果不能,这只是 PHP SSH2 API 的限制。不是从本质上来自 SSH 的东西。


    由于 SSH API 通常允许指定单独的公钥文件,当密钥对文件(通常不是真正正确地称为私钥文件)就足够了,请参阅我的回答:
    Purpose of pubkey parameter of JSch.addIdentity

    我认为,鉴于 PHP SSH API,该参数相当无用,因为该 API 甚至不允许您加载多个密钥,而且您必须预先指定密码。

    【讨论】:

    • 不幸的是,PHP 确实要求参数是一个真实文件的路径,并且该文件必须是一个真实的公钥,由几个断言语句强制执行长度和格式。虽然你确实回答了我的问题,但还是谢谢你。
    【解决方案2】:

    当您“登录网站”时,您总是出示 public 密钥。

    相应的私钥应该非常安全地保存在服务器上,以便它可以使用它来验证提供的公钥。 私人密钥不应该“在野外”。

    存在替代方案 - 通常,服务器仅包含“签名密钥”(用于自行颁发的证书),或者它仅依赖于所提供的密钥已由公认的权威机构签名这一事实。

    【讨论】:

    • 这不能回答问题。此外,PHP 函数同时要求私有和公共,这只会稍微改变问题“为什么它需要两者?”
    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 2015-04-13
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多