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

Mar*_*eIV 8 ssh github bitbucket atlassian-sourcetree

更新 - 它发生了再次!

好了,这只是碰巧AGAIN!MAN真令人沮丧!!! 但是这次我挖得更深一些,发现由于某种原因,我的私钥被卸下了.

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

ssh-add -l -E md5
Run Code Online (Sandbox Code Playgroud)

我明白了......

The agent has no identities.
Run Code Online (Sandbox Code Playgroud)

但是,如果我然后运行这个......

ssh-add /Users/[username]/.ssh/[private key]
Run Code Online (Sandbox Code Playgroud)

一切都有效!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
# ----------------------------
Run Code Online (Sandbox Code Playgroud)

这是我的〜/ .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
Run Code Online (Sandbox Code Playgroud)

这是我的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]
Run Code Online (Sandbox Code Playgroud)

注意:不确定这是否重要,但您可以看到第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).
Run Code Online (Sandbox Code Playgroud)

看看它似乎没有应用中定义的键configknown_hosts?这似乎是一个问题,不是吗?

注:我使用MacOS的塞拉利昂,我已经更新了我的路,包括/usr/bin之前/usr/local/bin所概述这里.如果我不这样做,我会收到错误,说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. 现在我可以再次推拉.

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

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

那么有人可以提供有关如何使我的SSH密钥"坚持"的建议吗?

Mar*_*eIV 6

好吧,我想我已经弄清楚了所有部分。

为了帮助人们获得所需要的东西,以下是直接的解决方案:

  1. 确保在config文件中配置了要自动加载的密钥,UseKeychainAddKeysToAgent设置了和
  2. 确保从终端连接到那些配置定义的主机
  3. 创建一个LaunchAgent以运行ssh-add -A以自动重新加载您的钥匙串存储的钥匙

好了,现在您知道该怎么办,这就是“为什么”。

这肉

正如我在问题中所解释的,最近,每当我重新启动时,我(错误地)都认为系统丢失了我的私钥。不是失去他们,只是无视他们。这是因为,对于像我这样从未使用过终端机进行GIT的人来说,一堆东西杂乱无章。

  1. 在最新版本的macOS中,Apple更改了其实施SSH的方式,以便与OpenSSH的实施更好地匹配
  2. #1的结果是,ssh-add -K [privateKey]不再将密钥存储在钥匙串中(它实际上会忽略-K。)。尽管它们确实被添加到了该会话的ssh中,因此您的连接将再次起作用-一旦您重新启动,它们将不再起作用。(这就是让我发疯的原因!)
  3. 即使键即在钥匙扣,苹果不再加载它们自动意味着你必须手动调用ssh-add -A从终端每次重新启动时重新加载它们。
  4. 但是,如上所述,ssh-add -K [privateKey]不再将密钥添加到钥匙串中,因此ssh-add -A对于以这种方式添加的密钥来说毫无意义。(它们可以通过另一种方式添加到“钥匙串”中。稍后,将进行更多介绍。)

由于上述原因,-K在升级操作系统之前手动与选件一起添加的任何密钥仍将位于您的钥匙串中。但是,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
Run Code Online (Sandbox Code Playgroud)

可是等等!如果您查看我的配置文件,则确实设置了这些值!那为什么不起作用呢?

两件事情。

  1. 我从不使用终端机。我使用SourceTree,它不使用该文件中的主机条目
  2. 从技术上讲,Apple仅在访问该主机时按需添加(并存储)密钥,而不是在(重新)加载文件时按需添加(这意味着除非您显式访问该主机,否则不会发生任何事情)。

就我而言,通过SourceTree添加密钥将为该初始会话添加密钥,但是一旦我重新启动,密钥将不会再次加载,因此所有连接都将失败。ssh-add -A也不会修复它,因为它们又不在钥匙串中了,这意味着我又回到了使用手动在命令行中添加每个代码的问题ssh-add [privateKey]。真痛苦!

然后发生在我身上...如果该设置位于配置文件中,并且可以从命令行使用该条目,那么我是否应该能够直接连接到该主机,从而将密钥添加到我的钥匙串中?让我们找出答案!我输入了这个...

ssh -T MarqueIV-BitBucket
Run Code Online (Sandbox Code Playgroud)

确实,不仅将密钥添加到了ssh,而且还再次将其添加到了我的钥匙串中!我通过直接检查钥匙串访问来确认这一点,并且它在那里。

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

ssh-add -D
Run Code Online (Sandbox Code Playgroud)

删除了我所有的钥匙。果然,我的SourceTree连接又全部失败了。

然后我跑了这个...

ssh-add -A
Run Code Online (Sandbox Code Playgroud)

钥匙串存储的钥匙神奇地恢复了,连接又重新开始了!哇!

好的,差不多了,但是不完全是!那重启呢?同样,Apple不再自动从钥匙串加载钥匙。当然,现在只是快速输入要输入的终端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>
Run Code Online (Sandbox Code Playgroud)

由于我只想为我的特定用户使用,因此将其存储在这里:

~/Library/LaunchAgents
Run Code Online (Sandbox Code Playgroud)

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

果然,在重新启动后,我所有的密钥都恢复了并且处于活动状态!人际关系全都有效,孩子们玩耍,成年男子哭了,这在密码王国是美好的一天!

总结一下:

  1. 苹果改变了SSH的工作方式
  2. 密钥不再从命令行添加到“钥匙串”中
  3. 苹果也不再自动加载密钥存储在钥匙串
  4. 使用终端连接到固定定义#2的配置定义的主机
  5. 使用LaunchAgent固定#3

希望这可以帮助!现在是时候让我的肩膀酸痛了,以至于我一直努力地想尽办法来解决这个问题!;)