Мне сложно найти нужные документы о порядке, в котором клиент OpenSSH пытается использовать закрытые ключи для аутентификации на сервере, учитывая, что все из следующего присутствуют:
~/.ssh
, например ~/.ssh/id_rsa
,~/.ssh/config
,ssh-agent
.Всегда ли пробуются все эти местоположения (при условии, что хост соответствует записи в ~/.ssh/config
), и в каком порядке?
Предыстория: у меня есть ~/.ssh/id_rsa
который может использоваться только для аутентификации на сервере А, и у меня есть еще один ключ, которым управляет ssh-agent
который может использоваться только для аутентификации на сервере B. При попытке ssh
к B, аутентификация не выполняется, по-видимому, потому что только ~/.ssh/id_rsa
пробовал. Кажется, нет возможности попробовать ключ, управляемый ssh-agent
.
Я знаю о параметрах -v, -vv и т. Д., Но я хотел бы знать, прежде чем я попробую, как будет вести себя ssh. Должен быть более разумный метод, чтобы выяснить это, чем метод проб и ошибок.
Используй источник, Люк!
OpenSSH - это открытый исходный код, поэтому вместо пробной ошибки вы можете прочитать код, чтобы лучше понять, что там происходит. ssh.c
это хорошее место для начала. Имеет функцию load_public_identity_files(void)
, который позаботится об этом. В первую очередь используются ключи от PKCS # 11 (Smartcard, 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
идентификаторы используются после идентификаторов по умолчанию.
Если вы хотите увидеть, как 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