为什么 PHP 的 ssh2_auth_pubkey_file 需要 public 密钥?

Why does PHP's ssh2_auth_pubkey_file require a public key?

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

$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 SSH2 功能的经验。但是PHPssh2_auth_pubkey_file internally calls libssh2_userauth_publickey_fromfile_ex from libssh2,其文档中说到publickey参数:

Path name of the public key file. (e.g. /etc/ssh/hostkey.pub). If libssh2 is built against OpenSSL, this option can be set to NULL.

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


为什么 SSH APIes 通常允许指定一个单独的 public 密钥文件,当密钥对文件(通常不是真正正确地称为私钥文件)就足够时,请参阅我的回答:

我相信考虑到 PHP SSH API,这个参数是相当无用的,因为 API 甚至不允许你加载多个密钥,你必须指定无论如何预先输入密码。

当您"log on to a web site,"时,您总是出示public键。

相应的私钥应该非常安全地保存在服务器上,以便服务器可以使用它来验证所提供的 public 密钥。 私钥 绝不能"out in the wild."

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