OpenSSH 按照什么顺序尝试私钥?

OpenSSH 按照什么顺序尝试私钥?

我很难找到关于 OpenSSH 客户端尝试使用私钥对服务器进行身份验证的顺序的正确文档,因为全部存在下列情况:

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

是否总是会尝试所有这些位置(假设主机与中的条目匹配~/.ssh/config),并且按照什么顺序?

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

答案1

我知道 -v、-vv 等选项,但在尝试 ssh 之前,我想先了解一下它是如何工作的。一定有比反复试验更明智的方法。

使用来源,卢克!

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

(nkeys = pkcs11_add_provider(options.pkcs11_provider, NULL,

然后是以下提供的密钥options.identity_files

for (i = 0; i < options.num_identity_files; i++) {

此变量设置在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);
}

文件的实际路径定义在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"

对于背景问题:

这正是此选项存在的原因,也是如果您有多个密钥需要管理IdentitiesOnly时应该使用它的原因 。身份在默认身份之后使用。~/.ssh/configssh-agent

答案2

如果您想了解 SSH 客户端如何尝试使用私钥对服务器进行身份验证,您可以使用 -v 选项运行它。

就我而言,它看起来像:

debug1: Trying private key: /Users/atolkachev/.ssh/id_rsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_dsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_ecdsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_ed25519

相关内容