OpenSSH 尝试私钥的顺序是什么?

ssc*_*rth 10 ssh private-key ssh-agent

鉴于以下所有内容都存在,我很难找到有关 OpenSSH 客户端尝试使用私钥对服务器进行身份验证的顺序的正确文档:

  • 具有默认名称的密钥文件~/.ssh,例如~/.ssh/id_rsa
  • 具有非默认名称的密钥文件配置为通过特定主机使用~/.ssh/config
  • 密钥由ssh-agent.

是否总是尝试所有这些位置(前提是主机与 中的条目匹配~/.ssh/config),以及按什么顺序?

背景:我有~/.ssh/id_rsa它只能用于对服务器A进行身份验证,并且我有另一个管理的密钥ssh-agent只能用于对服务器B进行身份验证。当试图ssh,认证失败,显然是因为 ~/.ssh/id_rsa是尝试。尝试由 管理的密钥似乎没有后备ssh-agent

Jak*_*uje 10

我知道 -v、-vv 等选项,但在尝试 ssh 的行为之前我想知道。必须有一种比反复试验更明智的方法来找出答案。

使用来源,卢克!

OpenSSH 是开源的,因此您可以阅读代码以更好地了解那里发生的事情,而不是试错。ssh.c是一个很好的起点。它有一个功能load_public_identity_files(void),可以处理这个问题。首先,使用来自 PKCS#11(智能卡、HSM)的密钥:

(nkeys = pkcs11_add_provider(options.pkcs11_provider, NULL,
Run Code Online (Sandbox Code Playgroud)

然后是提供的密钥options.identity_files

for (i = 0; i < options.num_identity_files; i++) {
Run Code Online (Sandbox Code Playgroud)

该变量设置在readconf.c

if (options->num_identity_files == 0) {
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_RSA, 0);
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_DSA, 0);
#ifdef OPENSSL_HAS_ECC
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_ECDSA, 0);
#endif
    add_identity_file(options, "~/",
        _PATH_SSH_CLIENT_ID_ED25519, 0);
}
Run Code Online (Sandbox Code Playgroud)

文件的真实路径定义在pathnames.h

#define _PATH_SSH_USER_DIR  ".ssh"
[...]
#define _PATH_SSH_CLIENT_ID_DSA     _PATH_SSH_USER_DIR "/id_dsa"
#define _PATH_SSH_CLIENT_ID_ECDSA   _PATH_SSH_USER_DIR "/id_ecdsa"
#define _PATH_SSH_CLIENT_ID_RSA     _PATH_SSH_USER_DIR "/id_rsa"
#define _PATH_SSH_CLIENT_ID_ED25519 _PATH_SSH_USER_DIR "/id_ed25519"
Run Code Online (Sandbox Code Playgroud)

背景问题:

这正是该IdentitiesOnly选项存在的原因,以及为什么您应该在~/.ssh/config有多个密钥需要管理的情况下使用它 。该ssh-agent身份在默认的后使用。

  • 虽然我很感谢您为我深入研究源代码,但这并不比反复试验更明智(就工作量而言)。我的意思是,这*必须*记录在某处,因为它对于正确配置 SSH 至关重要。 (2认同)