如何防止SourceTree / SSH忘记SSH密钥? (我必须手动重新运行'ssh-add'才能让它再次运行!)

时间:2017-12-14 01:59:40

标签: github ssh bitbucket atlassian-sourcetree

更新 - 它发生了再次!!!

好的,所以这只是发生了 AGAIN ! MAN真令人沮丧!!!但是这次我挖了一点,发现由于某种原因,我的私钥被卸下了。

具体来说,当我称之为......

ssh-add -l -E md5

我明白了......

The agent has no identities.

但是,如果我再运行这个......

ssh-add /Users/[username]/.ssh/[private key]

一切都有效! SourceTree就像它应该的那样连接。

问题是 为什么我必须继续运行'ssh-add'命令?!为什么它会忘记我的钥匙?!

正如其他地方所提到的,不确定这是否有所作为,但我正在使用High Sierra运行MacBook Pro,尽管这也发生在Sierra上。

原帖:

这个让我既难倒,又生气了! SourceTree(或ssh或其他东西!)每天都在忘记/不应用/忽略我的SSH密钥!我不知道为什么。

  

注意:已更新为使用BitBucket的信息而不是GitHub。

以下是我当前config文件的相关部分

# --- Sourcetree Generated ---
Host MarqueIV-Bitbucket
    HostName bitbucket.org
    User MarqueIV
    PreferredAuthentications publickey
    IdentityFile /Users/MarqueIV/.ssh/MarqueIV-Bitbucket
    UseKeychain yes
    AddKeysToAgent yes
# ----------------------------

这是我的〜/ .ssh文件夹的“ls”(截断)

-rw-r--r--@ 1 MarqueIV  staff   421 Dec 14 11:25 config
-rw-r--r--@ 1 MarqueIV  staff  1808 Dec  9 14:20 known_hosts
-rw-------  1 MarqueIV  staff  3243 Dec  6 23:33 MarqueIV-Bitbucket
-rw-r--r--  1 MarqueIV  staff   781 Dec  6 23:33 MarqueIV-Bitbucket.pub

这是我的known_hosts文件(密钥已编辑)

bitbucket.org,104.192.143.3 ssh-rsa [redacted]
bitbucket.com,104.192.143.9 ssh-rsa [redacted]
104.192.143.2 ssh-rsa [redacted]
  

注意:不确定这是否重要,但您可以看到第1行和第2行似乎是重复的。

这是ssh -Tv git@bitbucket.org

的输出
OpenSSH_7.6p1, LibreSSL 2.6.2
debug1: Reading configuration data /Users/MarqueIV/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Connecting to bitbucket.org port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/MarqueIV/.ssh/id_ed25519-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.6
debug1: Remote protocol version 2.0, remote software version conker_1.0.315-a08d059 app-153
debug1: no match: conker_1.0.315-a08d059 app-153
debug1: Authenticating to bitbucket.org:22 as 'git'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ssh-rsa
debug1: kex: server->client cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ssh-rsa SHA256:zzXQOXSRBEiUtuE8AikJYKwbHaxvSc0ojez9YXaGp1A
debug1: Host 'bitbucket.org' is known and matches the RSA host key.
debug1: Found key in /Users/MarqueIV/.ssh/known_hosts:1
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:h+6zCXg32Uw4fYxSUMwYst3zee8RFb9Z47H1QUTz58E /Users/MarqueIV/.ssh/MarqueIV-GitHub
debug1: Authentications that can continue: publickey
debug1: Trying private key: /Users/MarqueIV/.ssh/id_rsa
debug1: Trying private key: /Users/MarqueIV/.ssh/id_dsa
debug1: Trying private key: /Users/MarqueIV/.ssh/id_ecdsa
debug1: Trying private key: /Users/MarqueIV/.ssh/id_ed25519
debug1: No more authentication methods to try.
git@bitbucket.org: Permission denied (publickey).

了解它似乎没有应用configknown_hosts中定义的密钥?这似乎是一个问题,不是吗?

  

注意:我正在使用macOS Sierra,我已更新了我的路径,在/usr/bin之前添加了/usr/local/bin,如here所述。如果我不这样做,我会收到一条错误,指出ssh无法识别配置中的UseKeychain yes

因此,几乎每天这里都是我必须经历的例行程序。我将以GitHub为例。

  1. 我打开SourceTree并尝试从GitHub中获取最新信息。它失败了'git@github.com:权限被拒绝(公钥)。消息。

  2. 我从SourceTree中删除了我的GitHub帐户。

  3. 我从我机器上的.ssh文件夹中删除了GitHub的公钥和私钥。

  4. 我转到GitHub并从我的帐户中删除旧的公钥。

  5. 回到SourceTree,我使用我的用户名和密码再次登录GitHub。

  6. 使用SourceTree登录后,我为GitHub生成了一个新的SSH密钥对。

  7. 我将我的公钥复制到我的GitHub帐户中的SSH区域。 (有时我注意到它会为我添加它,但我喜欢安全并仔细检查。)

  8. 现在我可以再次推拉。

  9. 我回家过一天,然后在家里登录。它又失败了。重复上述所有步骤。

    如何获取SourceTree / ssh /无论如何记住我的da * n键,这样每次更改位置时我都不必继续这样做?!我错过了什么步骤???

    那么有人可以就如何使我的SSH密钥“坚持”提出建议吗?

3 个答案:

答案 0 :(得分:4)

好的,我想我找到了所有部件。

为了帮助人们获得他们所追求的目标,请事先找到解决方案:

  1. 确保在config文件中配置了您要自动加载的密钥,并设置UseKeychainAddKeysToAgent
  2. 确保从终端连接到那些配置定义的主机 !!
  3. 创建一个LaunchAgent来运行ssh-add -A以自动重新加载钥匙串存储的密钥
  4. 好了,现在你知道该怎么做了,这就是为什么'。

    正如我的问题所解释的,最近,每当我重新启动时,我(错误地)认为系统丢失了我的私钥。它并没有失去它们,只是忽略了它们。这是因为一些事情在一个完美的混乱风暴中聚集在一起,对于像我这样从未使用GIT终端的人来说。

    1. 在最新版本的macOS中,Apple改变了它实现SSH的方式,以便更好地匹配OpenSSH的实现
    2. 作为#1的结果,ssh-add -K [privateKey]不再将密钥存储在钥匙串中(它实际上忽略了-K。)虽然它们确实被添加到该会话的ssh中 - 因此您的连接将再次起作用 - 一旦重新启动,它们将不再起作用。 (这就是让我发疯的原因!)
    3. 即使对于钥匙串中 的钥匙,Apple也不会自动加载它们,这意味着您每次重新启动时都需要手动从终端呼叫ssh-add -A以重新加载它们。
    4. 但是,如上所述,ssh-add -K [privateKey]不再将密钥添加到钥匙串,因此无论如何ssh-add -A对于以这种方式添加的密钥毫无意义。 (他们可以通过另一种方式添加到Keychain。一分钟内就可以了。更多信息。)
    5. 由于上述原因,在升级操作系统之前手动添加-K选项的任何键仍将存在于您的钥匙串中。但是,Apple更改后添加的密钥不是。

      也就是说,Apple 仍然能够在钥匙串中存储密钥,但不能再从ssh-add存储密钥。它现在仅适用于config文件中定义的主机。

      现在这是将钥匙串放入钥匙串的唯一方法。

      再次,这是我的配置:

      Host MarqueIV-Bitbucket
          HostName bitbucket.org
          User git <-- Make sure this is 'git', not what SourceTree puts here
          PreferredAuthentications publickey
          IdentityFile /Users/MarqueIV/.ssh/MarqueIV-Bitbucket
          UseKeychain yes    <-- Note here
          AddKeysToAgent yes <-- ...and here
      

      但是等等!如果您查看我的配置文件, 会设置这些值!那么为什么它不起作用呢?

      两件事。

      1. 我永远不会使用终端。我使用的SourceTree没有使用该文件中的主机条目
      2. Apple技术上只在访问该主机时按需添加(并存储)密钥,而不是在(重新)加载文件时,除非您明确访问该主机,否则没有任何反应。
      3. 在我的情况下,通过SourceTree添加密钥会为初始会话添加密钥,但是一旦重新启动,密钥将再次加载,因此所有连接都将失败。 ssh-add -A无法修复它,因为它们不在钥匙串中,这意味着我又回到手动添加ssh-add [privateKey]命令行中的每一个。多么痛苦!!

        然后它发生在我身上......如果该设置在配置文件中,并且该条目可以在命令行中使用,那么我不应该能够直接连接到该主机,从而添加了我钥匙串的钥匙?让我们来看看吧!我打字了......

        ssh -T MarqueIV-BitBucket
        

        果然,不仅是键添加到ssh中,而且它还被添加到我的钥匙串中!我通过直接检查Keychain Access确认了这一点,它就在那里。

        为了进一步测试,我跑了这个......

        ssh-add -D
        

        删除了我的所有密钥。果然,我的SourceTree连接都再次失败。

        然后我跑了这个......

        ssh-add -A
        

        并且钥匙串存储的键神奇地回来了,连接又开始工作了! WOOT!

        好的,几乎就在那里,但并不完全!重启怎么样?同样,Apple不再自动从Keychain加载密钥。当然,它现在只是一个快速的短途旅行到终端键入ssh-add -A,但同样,我不应该这样做!

        输入LaunchAgents!

        LaunchAgents和LaunchDaemons超出了对这篇文章的讨论,但简而言之,它们允许您在重启,按计划,系统发生变化等时执行某些操作。

        在我的情况下,我想要在登录我的Mac时运行的东西,所以LaunchAgent是最好的选择。

        这是我的plist定义每次登录帐户时如何执行ssh-add -A(即使我从未触及过终端):

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
        <dict>
            <key>Label</key>
            <string>ssh-add-a</string>
            <key>ProgramArguments</key>
            <array>
                <string>ssh-add</string>
                <string>-A</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
        </dict>
        </plist>
        

        由于我只想为我的特定用户提供此功能,因此我将其存储在此处:

        ~/Library/LaunchAgents
        
          

        注意:请务必更改权限以允许其执行,否则它将无法启动!

        果然,在重新启动时,我的所有按键都恢复正常!连接都奏效了,孩子们玩了,成年男人哭了,这是Code-dom中的美好一天!

        所以回顾一下:

        1. Apple改变了他们的SSH工作方式
        2. 密钥不再从命令行添加到Keychain
        3. Apple也不再自动加载 存储在钥匙串中的密钥
        4. 使用终端连接已修复的配置定义主机#2
        5. 使用LaunchAgent修复#3
        6. 希望这有帮助!现在是时候去为我酸痛的肩膀做一些冰爽的热情了,我一直在拍拍自己这么难以搞清楚这一切! ;)

答案 1 :(得分:0)

首先,安装latest Git for Windows release2.15.1.2 one,只需将存档PortableGit-2.15.1.2-64-bit.7z.exe解压缩到任意位置,然后adding it to your PATH

其次,请确保您的SourceTree is using the System Git

第三,test in command-line if your ssh key is recognized

ssh -T git@github.com

Hi username! You've successfully authenticated, 
but GitHub does not provide shell access.

最后,确保 SourceTree / Tools / Option 将OpenSSH用作SSH客户端(不是putty)

然后SourceTree应该重新使用你的ssh密钥。

从您的日志中,~/.ssh/config生成错误:它提到用户是您的用户名 无论何时建立与github.com/bitbucket.org的SSH连接,它都不会像你那样#34;。它始终为git

Host MarqueIV-Bitbucket
    HostName bitbucket.org
    User MarqueIV
    PreferredAuthentications publickey
    IdentityFile /Users/MarqueIV/.ssh/MarqueIV-Bitbucket
    UseKeychain yes
    AddKeysToAgent yes

使用ssh -Tv MarqueIV-Bitbucket

进行测试

答案 2 :(得分:0)

〜/ .ssh / config摘录仅适用于主机MarqueIV-Bitbucket。如果您的SSH远程列表被列为MarqueIV-Bitbucket:owner/repo,那么SSH和SourceTree 应该尊重该配置;您可以使用ssh -Tv MarqueIV-Bitbucket并将一个或多个遥控器更新为MarqueIV-Bitbucket:owner/repo.git格式进行确认。