OpenSSH以哪种顺序尝试私钥?

我很难find正确的文档在OpenSSH客户端尝试私钥对服务器进行身份validation的顺序,因为以下所有内容都存在:

  • ~/.ssh使用默认名称的密钥文件,例如~/.ssh/id_rsa
  • 具有非默认名称的密钥文件通过~/.ssh/configconfiguration为与特定主机一起使用,
  • ssh-agentpipe理的密钥。

是否所有这些位置总是尝试(假设主机匹配~/.ssh/config中的条目),并且以何种顺序?

背景:我有~/.ssh/id_rsa只能用来对服务器A进行身份validation,而我有另一个由ssh-agentpipe理的密钥,只能用来对服务器B进行身份validation。 当试图对B进行ssh时,authentication失败,显然是因为只有 ~/.ssh/id_rsa被尝试。 似乎没有回退尝试由ssh-agentpipe理的密钥。

我知道的-v,-vv等选项,但我想知道之前,我试着如何performancessh。 要找出比试验和错误更好的方法。

使用源码,卢克!

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++) { 

这个variables在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); } 

这些文件的真实path在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使用它,如果你有多个键来pipe理的话。 ssh-agent身份在默认身份之后使用。

如果您想查看SSH客户端如何使用私钥对服务器进行身份validation,则可以使用-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