如何将 Mac OS X 钥匙串与 SSH 密钥一起使用?

Joh*_*ley 152 ssh keychain macos

我知道自从 Mac OS X Leopard 以来,Keychain 已经支持存储 SSH 密钥。有人可以解释一下这个功能应该如何工作。

我有一些生成的 RSA 密钥存储在我的 ~/.ssh 目录中,用于访问各种服务器。我没有在这些键上设置密码。目前为了登录这些服务器,我在终端中使用以下命令:

评估`ssh-agent`
ssh 添加 ~/.ssh/some_key_rsa
ssh 用户@服务器

(我已经编写了一些 Bash 函数来使这更容易。)

使用钥匙串有没有更好的方法来做到这一点?

小智 271

从 OS X 的 Leopard 版本开始,ssh-agent 与 Keychain 的集成更加紧密。可以将所有 SSH 密钥的密码安全地存储在钥匙串中,ssh-agent 将在启动时从中读取它们。最重要的是,使用密码短语保护您的密钥很简单,但永远不必输入密码短语才能使用它们!方法如下:

将密码短语添加到钥匙串的每个 ssh 密钥:(选项 -k 仅加载普通私钥,跳过证书)

ssh-add -K [path/to/private SSH key]
Run Code Online (Sandbox Code Playgroud)

(注意这是一个大写的 K)

每当您重新启动 Mac 时,钥匙串中的所有 SSH 密钥都会自动加载。您应该能够在 Keychain Access 应用程序中以及通过命令行查看密钥:

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

  • 如果你通过像 Homebrew 这样的软件包系统安装了另一个版本的 SSH,那么就需要使用像 `/usr/bin/ssh-add` 这样的绝对路径。 (5认同)
  • 对于 macOS Sierra,情况发生了变化。见 https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain (4认同)
  • https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ssh-add.1.html 您还需要 -K 选项来在钥匙串中存储密码。 (2认同)
  • 有趣的是,在我的 macOS Sierra 中,它在重启后不会要求输入密码,但 `ssh-add -l` 返回“代理没有身份”。(`ps aux` 包括 `/usr/bin/ssh-agent -l`)。 (2认同)

Ric*_*aez 91

macOS Sierra 开始,当您登录帐户时,ssh-agent不再自动加载之前加载的 ssh 密钥。这是 Apple 有意为之,他们希望与主流OpenSSH实现重新保持一致。[1]


正如解释在这里,这是因为推荐的方法MACOS 10.12.2

  1. 将以下行添加到您的~/.ssh/config文件中:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您使用该命令添加到ssh-agent 的任何密钥ssh-add /path/to/your/private/key/id_rsa都将自动添加到钥匙串中,并且应该在重新启动时自动加载。


以下内容已弃用(保留以供参考)。

要回到之前的行为,您需要ssh-add -A在登录时运行该命令(它会自动加载所有在您的钥匙串上具有密码短语的 ssh 密钥)。为此,请执行以下步骤:

  1. 首先,使用命令将要自动加载的所有密钥添加到ssh-agentssh-add -K /absolute/path/to/your/private/key/id_rsa。该-K参数确保将密钥密码添加到macOS 的 keychain。确保使用密钥的绝对路径。使用相对路径将使自动启动的脚本无法找到您的密钥。

  2. 确保在您键入时所有键都显示为已添加ssh-add -A

  3. 创建一个名为文件com.yourusername.ssh-add.plist~/Library/LaunchAgents/有如下内容。像这样的Plist 文件用于launchd在您登录时运行脚本。[2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</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)
  4. 告诉launchd加载plist文件,你只是执行创建:launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist

你应该准备好了。


小智 38

有一种比Ricardo 的答案更简单的方法来在运行 10.12 Sierra 的 Mac 的会话/重新启动之间保留密码。

  1. ssh-add -K ~/.ssh/id_rsa
    注意:将路径更改为您的 id_rsa 密钥所在的位置。
  2. ssh-add -A
  3. 创建(或编辑,如果存在)以下~/.ssh/config文件:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    
    Run Code Online (Sandbox Code Playgroud)

    现在密码在重新启动之间记住了!

Apple 有意更改了 macOS 10.12 Sierra 中 ssh-agent 的行为,以不再自动加载以前的 SSH 密钥,如OpenRadarTwitter 讨论Apple 技术说明中所述。上面的解决方案将模仿 El Capitan 的旧行为并记住您的密码。

  • 太棒了,就像一个魅力,恕我直言,比其他人更干净,并在正确的地方解决了:) (2认同)
  • 相关:[*运行`ssh-add -K`将我的SSH密钥添加到Apple Keychain后,Keychain Access.app中显示的条目名称和类型是什么?*](https://apple.stackexchange.com /q/345037/17907) (2认同)

小智 18

要使其工作,$SSH_AUTH_SOCK应将环境变量指向/tmp/launch-xxxxxx/Listeners. 这应该在您登录时自动完成。该套接字上的侦听器使用 ssh-agent 协议。

您的 bash 脚本正在启动您自己的 ssh 代理(拼写为ssh-agent,而不是 ssh_agent)并覆盖ssh-agent在登录时为您设置的现有代理。

此外,钥匙串的重点是将密码存储到您的 ssh 密钥,但您说您没有在这些密钥上设置密码,所以我不确定您对钥匙串集成的期望。

最后,当您第一次登录时,您可能不会看到 ssh-agent 进程。该进程将在第一次尝试读取/tmp.

  • 每次运行 ssh 时它都会提示我输入密码。关键是我不想输入任何密码。 (3认同)

sim*_*air 10

注意:对于 macOS Sierra,请参阅ChrisJF 的最新答案

[Jeff McCarrell 的回答][2] 是正确的,除了添加密码的命令包含破折号而不是连字符,即–K代替-K,导致消息效果为–K: No such file or directory。它应该是:

ssh-add -K [path/to/private SSH key]
Run Code Online (Sandbox Code Playgroud)

  • 这应该是对您引用的答案的评论,而不是新的答案。我们在这里谈论安全性。有人可能会建议您应该仔细输入它,而不是盲目地复制和粘贴`ssh-add -K` (2认同)

Oll*_*lly 6

我怀疑您没有使用默认ssh命令。你是ssh通过ports安装的吗?尝试which ssh查看ssh您使用的是哪个命令。

通常它应该显示一个对话框,询问您的密码,如果它尚未存储在您的钥匙串中。


ork*_*den 6

我在尝试使用客户端 ssh 证书登录时遇到了类似的问题。在这种特定情况下,它用于访问 git 存储库。这是当时的情况:

  • 密钥已保存在 ~/.ssh/
  • 私钥有密码。
  • 密码存储在 OS X 登录钥匙串中。 ~/Library/Keychains/login.keychain
  • 连接如下:我的mac->远程mac ->git/ssh服务器
  • Mac OS X 10.8.5

当我使用远程桌面连接到远程 mac 时,我没有问题。但是,当使用 SSH 连接到远程 mac 时,每次都要求我输入 ssh 密码。以下步骤为我解决了它。

  1. security unlock-keychain密码存储在登录钥匙串中。这将解锁它并使 ssh-agent 能够访问它。
  2. eval `ssh-agent -s`启动 ssh-agent 以供 shell 使用。它将从钥匙串中获取密码并使用它来解锁私人 ssh 密钥。
  3. 建立 ssh/git 连接并完成我的工作。
  4. eval `ssh-agent -k` 杀死正在运行的 ssh-agent。
  5. security lock-keychain 再次锁定钥匙串。