我很难找到关于 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/config
ssh-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