钥匙串

钥匙串

钥匙串(SSH agent)是储存密钥的高速缓存。具体的可以参考 SSH Keys

建议

建议不要使用钥匙串,而是每次ssh登陆时,都手动指定密钥路径,方法详见手动指定密钥路径。这样能避免在使用钥匙串时,因钥匙串中密钥过多,ssh登陆时超过服务器到密钥数量限制,以至无法登陆。

使用钥匙串

  • 在ssh登陆时,如果没有指定密钥路径(不论是在~/.ssh/config里配置IdentityFile <密钥路径>,还是在ssh命令中加-i <密钥路径>参数),ssh会采用如下策略:
    • 如果钥匙串是空的,就会使用默认密钥~/.ssh/id_rsa
    • 如果钥匙串非空,就会将钥匙串中的密钥逐一尝试,直到超过服务器允许登陆时使用的密钥数目的上限。

向钥匙串添加密钥

  • 使用时自动添加:每当使用密钥登陆服务器(比如执行sshssh-copy-id等命令),就会将当前使用的密钥添加到钥匙串中。
  • 手动添加:ssh-add <私钥路径>
  • 开机自动添加:见下文Mac重启后自动ssh-add私钥 (不推荐使用,会造成钥匙串中密钥过多,ssh登陆时超过服务器到密钥数量限制)

清空钥匙串

ssh-add -D # 清空已有KeyChain

查看钥匙串中密钥

使用命令ssh-add -l可以看到所有的密钥列表:

ssh-add -l
# 2048 db:6a:da:46:6e:03:da:94:f0:2c:43:1d:91:8a:bd:67 yeungeek@gmail.com (RSA)
# 2048 07:59:9f:93:d2:e3:80:e1:df:77:ed:c9:5d:2e:3d:04 yeungeek@gmail.com (RSA)
# 2048 4f:ba:6c:00:12:41:0e:a8:50:be:f5:6e:2e:7a:10:91 yeungeek@gmail.com (RSA)

ssh-add -L可以查产到所有密钥的公钥:

ssh-rsa wBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9MwBz/y9oybSLYNEVVzoi+HdcO4CCQ7k9M mac@mac-MBP.local
ssh-rsa +y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo+y6CL2IeCuvZMOPKSBx6+gvGkr1TmBLo mac@mac-MBP.local

关于钥匙串的报错

没有能登陆的密钥

ssh登陆时,如果登陆失败,并出现如下报错,则说明本地钥匙串中没有能登陆服务器的密钥。

Could not open a connection to your authentication agent

可以尝试以下两种解决办法:

向钥匙串中添加对应的密钥

不推荐,因为会造成钥匙串中密钥过多,ssh登陆时超过服务器到密钥数量限制。

ssh-agent bash
ssh-add ~/.ssh/<密钥名字> 

手动指定密钥路径

推荐。

~/.ssh/config里,配置如下,然后用ssh <服务器别名>登陆。

Host <服务器别名>
     HostName <服务器地址>
     User <用户名>
     IdentityFile <密钥路径>

或者

ssh -i <密钥路径> <用户名>@<服务器地址>
# 或
ssh -i <密钥路径> <服务器别名>

密钥数量过多

ssh登陆或执行ssh-copy-id时,若出现报错

Received disconnect from <服务器地址> port <端口号>:2: Too many authentication failures

则说明钥匙串的ssh密钥太多了(ssh-add -L可以查看所有钥匙串里的密钥),需要手动指定如何登陆:

只用密码登陆

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <用户名>@<服务器地址>
# 或
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <服务器别名>

上述参数同样适用于 ssh-copy-id

ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no -i <密钥路径> <用户名>@<服务器地址>
# 或
ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no -i <密钥路径> <服务器别名>

只用指定密钥登陆

手动指定密钥路径

Mac重启后自动ssh-add私钥

以下原文在此备份一版本。该方法能实现mac永久添加私钥到钥匙串。

不推荐使用该方法,因为会造成钥匙串中密钥过多,ssh登陆时超过服务器到密钥数量限制。

管理服务器有一些安全常识:

  • 禁止 root 远程登录
  • 禁止密码登录
  • 使用 priviate / public key 作为默认的登录方式。
  • 修改 sshd 端口

From Linode: Securing your server

安全级别上去后,问题随之而来,有一堆的私钥需要管理。每次 Macbook 升级系统,需要一次次手工 ssh-add 私钥,特别心烦。

几年前有这种方法 ssh-add -K privateKey 可以一劳永逸的把私钥存到 keychain 中,重启后也不需要手动 ssh-add,非常方便。

这种方式不管用了。

img

新的解决方法

创建 Automator 任务加载私钥,然后放到开机启动中。

  1. 创建一个 Automator task.img
  2. 在 task 中写一串 shell scriptimg
  3. 把 task 添加到 login items 中,每次系统重启后会执行这个 Automator task,自动 ssh-add 所有的私钥。imgimg

搞定!