Назад | Перейти на главную страницу

В каком порядке OpenSSH пытается использовать закрытые ключи?

Мне сложно найти нужные документы о порядке, в котором клиент OpenSSH пытается использовать закрытые ключи для аутентификации на сервере, учитывая, что все из следующего присутствуют:

Всегда ли пробуются все эти местоположения (при условии, что хост соответствует записи в ~/.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