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
身份在默认的后使用。