Github s sh -T git@github.com показывает старое имя пользователя, которого нигде нет - PullRequest
1 голос
/ 26 февраля 2020

git config --list показывает мне мое правильное новое имя пользователя (то же самое для глобального), и правильные пути s sh push / fetch. Но если я наберу ssh -T git@github.com, меня встретит мое старое имя пользователя, которое я сейчас не использую.

Я даже проверил диспетчер учетных данных Windows и удалил все учетные данные; все тот же эффект. Это старое имя нигде не найти. Чего мне не хватает?

РЕДАКТИРОВАТЬ: Это связано с тем, что ssh-agent не может получить мои s sh -ключи. Если я вручную добавлю s-1026 * -ключи к агенту, он будет работать. Возникают два вопроса:
1) Откуда взято старое имя пользователя?
2) Почему оно не добавляет автоматически мои s sh -ключи? Они находятся в пути $ HOME / .s sh, и я добавил агент с автозагрузкой s sh в Git для Windows сценария к моему .bashrc

РЕДАКТИРОВАТЬ 2: Благодаря вопросу Ли проблема решена. Я могу ответить на оба возникших вопроса:
1) Старое имя пользователя взято из ключа id_rsa s sh.
2) Скрипт работает только в том случае, если имя ключа точно равно id_rsa. Я неправильно понял документацию, полагая, что $ HOME / .ssh / mykey_rsa будет работать и для сценария, но это не так.
Так что, если кто-то наткнется на это: Удалить (сохраните, если он вам все еще нужен / переименуйте) свою id_rsa и создайте новую id_rsa. Это решит проблему.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Чтобы сделать это более понятным и ясным:

  1. Помните, что здесь задействовано как минимум два компьютера: ваш, где вы храните различные файлы и настройки и GitHub's. (GitHub использует несколько компьютеров, но они притворяются одним компьютером.)

  2. Ваш компьютер вызывает GitHub через Inte rnet, как если бы он звонил. Затем ваш компьютер передает какую-либо форму учетные данные . Их компьютер проверяет эти учетные данные и решает, являетесь ли вы тем, кем себя называете.

  3. Передаваемые вами учетные данные зависят от того, как вы выполняете вызов. Если вы делаете вызов, используя https://..., Git использует диспетчер учетных данных . Каждая ОС имеет свой собственный набор диспетчеров учетных данных, который может использовать Git, поэтому процесс здесь очень отличается от Windows, MacOS, Linux и т. Д. Если вы делаете вызов, используя ssh://..., все ОС имеют достаточно общей базы кода S SH, чтобы все они действовали почти одинаково на этом этапе, хотя все еще есть элементы, определяемые ОС c, которые появляются .

Поскольку вы используете S SH, то (один, но см. Ниже) учетные данные, которые вы передаете, являются ключом publi c s sh (также используя шифрование, используя ваш закрытый ключ - см., Например, эту статью о Digital Ocean ). Ваш ключ sh хранится в определенном для ОС c (и настраиваемом) месте. В вашем конкретном случае это было $HOME/.ssh/id_rsa.pub. Имя без .pub в конце - это закрытый ключ, и эти ключи идут парами.

Когда GitHub получает ваш ключ, они ищут его в гигантской таблице, в которой они сохраняйте каждый ключ, который им дали все . Ваш ключ никогда не совпадает с чьим-либо еще ключом. Ключ, который вы им дали, имеет имя пользователя , связанное с ним, когда вы давали им этот ключ. Так как только у вас есть этот ключ (и закрытый ключ, который go с ним), теперь GitHub может быть уверен, что вы тот, кем вы только что заявили.

Заявка полностью произошла через эту публикацию c ключ. Если вы больше не хотите претендовать на то, чтобы быть таким человеком, передайте ключ Отличный publi c. Вам также нужно будет войти в систему Git и дать им новый или обновленный ключ publi c. Это должно произойти после того, как вы сгенерировали пару открытого / закрытого ключа, и до того, как вы используете ssh для подключения вашего компьютера и вашего Git к их компьютеру с их Git.

Здесь необходимо знать о двух важных вещах, которые усложняют эту относительно простую картину. Опять же, упрощенное изображение: Существует одна пара ключей. Вы храните на GitHub ваш ключ publi c из этой одной пары ключей. Позже ваш Git вызывает GitHub через ssh. Ваши ssh и их sshd обмениваются некоторыми данными. Ваш s sh использует шифрование с использованием обоих ключей из вашей пары ключей. Теперь они знают, что вы - это вы, потому что они могут сопоставить все, используя свою копию вашего открытого ключа c, и only , у вас есть private key, который удалось разблокировать данные. Но вы можете захотеть сохранить более одной пары ключей на вашем компьютере, и это все усложнит.

Предоставление разных ключей разным получателям

Общее программное обеспечение s sh может последовательно пробовать различные пары ключей. См. Раздел ниже о нескольких ключах для (многих и сложных) деталей. Однако вы можете указать ему попробовать один конкретный файл , выбрав этот файл на основе хоста, на котором вы * sh, используя файл config ($HOME/.ssh/config) , Например, предположим, что вы хотите, чтобы все соединения с github.com использовали только пару ключей private-and-publi c, хранящихся в файлах $HOME/.ssh/id_rsa.github и $HOME/.ssh/id_rsa.github.pub. Тогда:

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa.github

сделает это. Первая строка, Host github.com, сообщает S SH, что приведенные ниже записи относятся к сеансам с хостом с именем github.com. (Шаблоны глобусов здесь разрешены, поэтому, если в вашей работе, в школе или где-либо еще есть хосты, имена которых совпадают с *.example.com, вы можете использовать такой шаблон глобуса.)

Вторая строка, IdentitiesOnly yes, переопределяет предложенные идентификаторы через с sh -агент . Вы можете или не можете сделать это! Если вы используете s sh -агент для идентификации, это намеренно побеждает (по крайней мере, некоторые из) предложений агента. Подробности см. В следующем разделе.

Последняя строка, IdentityFile <em>path</em>, задает имя ключа или файла пары ключей. ssh добавит или удалит .pub при необходимости здесь. (Существуют некоторые различия в версиях s sh, и вы можете хотеть или не хотеть .pub; используйте то, что вам подходит.)

Оба ssh (пользовательская команда, которая вас используется для подключения к серверу) и sshd (команда на сервере, к которому подключается ваш sh), очень настраиваемые. Полный список параметров конфигурации s sh см. на странице руководства ssh_config .

Агенты и IdentityFile записи

В каждом разделе конфигурации хоста Ваш $HOME/.ssh/config файл, вы можете поместить в несколько IdentityFile строк. Если вы это сделаете, s sh предложит каждый ключ, пока один из них не будет принят, или у него не останется ключей для предложения.

Если у вас есть нет IdentityFile строк, ваш S SH имеет некоторые встроенные значения по умолчанию. Они немного отличаются от одной версии S SH (и ОС) к другой; см. собственную ssh_config документацию для списка вашей системы, но в приведенной выше документации написано:

По умолчанию ... ~/.ssh/id_rsa и ~/.ssh/id_dsa для протокола версия 2.

(сейчас шифрование DSA по крайней мере устарело и, по большей части, полностью не поддерживается. Шифрование ECDSA, как мне кажется, является в настоящее время любимым, хотя шифрование не является моей областью.)

В отсутствие IdentitiesOnly yes S SH может также предлагать все идентификационные данные - то есть ключи - предоставленные вашим S SH Агентом . Агент - это вспомогательная система, которая позволяет вам отправлять ключи с одного компьютера (ваш самый надежный) на другой, не сохраняя их в файлах на менее доверенном компьютере. То, как это работает, выглядит относительно просто, в целом: когда ваш s sh связывается с другим хостом H , если вы не сказали IdentitiesOnly yes, ваш sh связывается с вашим агентом и спрашивает it , какие ключи попробовать. Он будет пробовать эти ключи на хосте H , по одному за раз. Если ни один из них не работает, у него все еще есть какой-либо локально сохраненный файл и / или файлы, перечисленные в записях IdentityFile.

Детали, однако, сложны. Во-первых, обратите внимание, что сам агент состоит из двух частей. (Это не обязательно отдельные программы, но о системе проще думать, описывая каждую как отдельную вещь.)

  • Одна часть выполняется на машине, которую вы делаете trust (с ключами, хранящимися в файлах).

  • Другая часть запускается на компьютере, на который вы входите, через ssh с этого доверенного компьютера. .

Обе машины запускают агента. Иногда вы можете запустить более одного агента на каждой машине, и опять-таки детали могут немного отличаться от одной ОС к другой - например, в MacOS, при простом входе в систему создается агент, который затем может использовать весь терминал windows , Из любого окна терминала вы запускаете ssh less-trusted-machine и запускаете новый сеанс на менее доверенной машине, а it также вызывает агента или использует уже имеющийся у вас агент или что-то еще.

Теперь вы используете Git на второй машине. sh компьютера с меньшим доверием замечает, что есть агент, и запрашивает у него ключи. Этот агент связывается с агентом на вашем более доверенном компьютере. Агент на вашем более доверенном компьютере извлекает ключи и передает их или не передает, все в зависимости от того, какие правила используют два агента и различные экземпляры s sh.

Следовательно, когда вы используете агент, набор ключей, которыми менее доверенная машина имеет (или имеет доступ), зависит от того, какой агент на more доверенная машина делает. Вот почему эта картина сложна.

Если вы вообще не используете агент или если в интерпретаторе командной строки вы собираетесь запустить ssh или запустить Git ssh, вы полностью победили агента, 1 s sh, который вы запускаете или запускаете Git, имеет доступ только к тем удостоверениям (парам ключей), которые есть в вашем $HOME/.ssh/ или другое специфицированное для ОС c место, где вы положили такие ключи. Конечно, он по-прежнему имеет доступ к всем ключам, которые вы там положили. Строка IdentitiesOnly yes в вашей конфигурации теперь означает, что использует только файлы, которые я перечислил здесь. Это довольно просто: вы перечисляете файлы - или, вернее, один из каждой пары файлов, и помещаете ключи в файлы .

Если вы используете с помощью агента, s sh, который вы используете или Git, имеете доступ к дополнительным парам ключей. Добавление IdentitiesOnly здесь сложно. Это не помешает вашему s sh связаться с агентом, но каждый из ключей, возвращаемых агентом, имеет идентификатор . Вы можете указать s sh, что вы используете , использовать только те удостоверения, которые соответствуют файлам, указанным мной в разделе IdentityFile. Это означает, что вы можете хранить только публичные c key , а не publi c и файлы пар закрытых ключей. Если вы не очень доверяете этой машине - той, которую я называл машиной с меньшей степенью доверия, - это дает вам возможность полностью исключить использование личного ключа с помощью агента.

Последнее, На какой бы машине вы ни делали хранили как публичные c, так и личные ключи, вы можете шифровать их. Теперь вам нужно ввести пароль или пароль, чтобы разблокировать их. Это может раздражать, но с помощью агента вы можете один раз разблокировать их для агента и доверять агенту, чтобы они были надежно защищены в памяти. (Как очень вы можете доверять этому агенту ... ну, это совсем другая проблема!)

Слишком много ключей

Фактическая разблокировка и проверка того, кто вы есть утверждается, что обычно это происходит внутри sshd, серверного программного обеспечения, которое реализует s sh. Ваш s sh вызывает свой sshd и передает ключ со всеми протоколами шифрования и тому подобным. Они пробуют это в замке, используя ключевую часть publi c пары ключей, и это работает ... или не работает - и если это не работает, они могут предложить вам больше пытается. Это настраивается на сервере.

Теперь предположим, что вы используете агент и в вашем агенте хранится пятьдесят (50) различных ключей. Ваш s sh, на каком бы компьютере вы ни находились - каким бы надежным он ни был, - получает один ключ от агента и передает его sshd, и это бесполезно. Ваш s sh получает следующий ключ от агента и пробует его, и это тоже не тот ключ. Это похоже на то, что вы нащупываете 50 ключей на связке ключей, даже не глядя на каждую клавишу, и пытаетесь запереть ее в замке. Через некоторое время sshd на сервере встревожены повторяющимися сбоями: похоже, вы пытаетесь взломать.

Фактическое количество попыток зависит от сервера, так как оно настраивается. Но если у вас есть много ключей, будет хорошей идеей попробовать правую клавишу (только или сначала). Для этого вам понадобится строка IdentitiesOnly yes, независимо от того, используете ли вы агент :

  • Если вы не используете агент, IdentitiesOnly yes означает, что использует только пары открытого и закрытого ключей, перечисленные здесь в каждой записи конфигурации IdentityFile. Таким образом, вы перечисляете правильный, а ваш sh использует правильный, и он соответствует lock и их sshd любит вас, и все хорошо.

  • Если вы используете агент, IdentitiesOnly yes означает , используйте ключ (и) агента, который соответствует publi c - ключ, указанный в записи конфигурации IdentityFile или записи здесь . Таким образом, вы перечисляете правильный, а ваш s sh использует правильный, и, как и раньше, все хорошо.

Если вы используете агент, но имеете только несколько ключей - всего один или два, а может быть, даже до шести или около того, в зависимости от конфигурации sshd на вызываемых вами серверах - вам не нужны IdentitiesOnly yes и IdentityFile строки. Но они не будут причинять боль , пока вы правильно их понимаете.

Соединяя все это вместе

  • Вы можете (и на самом деле должен) хранить файлы пары ключей где-нибудь на компьютере, которому доверяют. Вы также можете зашифровать , так что вы должны ввести пароль или пароль, чтобы разблокировать их, хотя это может раздражать. Агент может помочь. Вам может (вероятно, понадобится) загрузить ключей в этого агента, используя ssh-add.

  • Когда вы sh переходите с одного компьютера на другой, вы можете пусть ваш агент перенаправит новому агенту на следующем компьютере. Второй и все последующие компьютеры в цепочке нуждаются в ключе пары ключей publi c, чтобы убедиться, что вы - это вы, но если вы настроили переадресацию агента, им не нужно закрытый ключ.

  • Каждый компьютер в этой цепочке доверия, на который вы ssh заходите с более доверенного компьютера, принимает зашифрованные данные, которые вы отправляете изначально, при запуске сессия sh. Они используют сохраненный ключ publi c , который вы каким-то образом (любым способом, каким вам нравится / можете) уже хранится на менее доверенном компьютере, чтобы узнать, знаете ли вы private ключ Если вы это сделаете, вы должны быть самим собой.

  • За исключением того факта, что они представили свои sshd, GitHub на самом деле ничем не отличается: это просто компьютер с меньшим доверием что вы входите в систему (как git@github.com). Они берут ключ, который вы им даете, и ищут его, но вместо того, чтобы просто иметь один ключ для вас , у них есть один ключ для каждой учетной записи, которая существует на GitHub . Они пробуют ключ, который вы им дадите, и посмотрите, сработает ли он в замке для Алисы. Нет? Не должно быть Алиса; попробуйте это в замке для Боба. Нет? Попробуйте Кэрол - и так далее, пока, возможно, не откроются Фред, или Рита, или Зак. Когда они доберутся до сохраненного .pub ключа, который работает , ну, это должно быть то, кем вы являетесь. 2


1 В сеансе оболочки вы увидите переменную среды SSH_AUTH_SOCK, которая содержит путь, по которому ssh вы запускаете на эта машина связывается с агентом. Если вы переопределяете или отменяете переменную среды, это побеждает агента.

Чтобы узнать, активен ли агент и, если да, к каким ключам он имеет доступ, используйте ssh-add -l.

* 1320. * 2 Пробовать одну и ту же личность в одно и то же время, линейно через тысячи или миллионы личностей, слишком медленно, поэтому GitHub должен обязательно использовать другую стратегию для внутреннего использования. Но эффект тот же: вы дали им идентификационную битовую строку, используя пару открытых / закрытых ключей и шифрование, от своего s sh до их sshd. Они используют собранные авторизованные ключи для каждого и находят уникального кого-то в этой куче, и кого бы они ни нашли, это вас . Если они никого не находят, они отклоняют ключ, и ваш sh может go предложить другой ключ, вплоть до любого предела, установленного в их sshd.
0 голосов
/ 26 февраля 2020

Вы упоминаете, что используете Windows, поэтому вам необходимо выполнить следующие шаги:

Нам нужно удалить старые учетные данные:

Control Panel >> User Account >> Credential Manager >> Windows Credential >> Generic Credential Удалить GIT учетные данные .

После этого вам необходимо ввести учетные данные новой учетной записи:

$ git config --global user.name "Bob"
$ git config --global user.email "bob@example.com"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...