钥匙串
钥匙串
钥匙串(SSH agent)是储存密钥的高速缓存。具体的可以参考 SSH Keys。
建议
建议不要使用钥匙串,而是每次ssh登陆时,都手动指定密钥路径,方法详见手动指定密钥路径。这样能避免在使用钥匙串时,因钥匙串中密钥过多,ssh登陆时超过服务器到密钥数量限制,以至无法登陆。
使用钥匙串
- 在ssh登陆时,如果没有指定密钥路径(不论是在
~/.ssh/config
里配置IdentityFile <密钥路径>
,还是在ssh
命令中加-i <密钥路径>
参数),ssh会采用如下策略:- 如果钥匙串是空的,就会使用默认密钥
~/.ssh/id_rsa
- 如果钥匙串非空,就会将钥匙串中的密钥逐一尝试,直到超过服务器允许登陆时使用的密钥数目的上限。
- 如果钥匙串是空的,就会使用默认密钥
向钥匙串添加密钥
- 使用时自动添加:每当使用密钥登陆服务器(比如执行
ssh
、ssh-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,非常方便。这种方式不管用了。
新的解决方法
创建 Automator 任务加载私钥,然后放到开机启动中。
- 创建一个 Automator task.
- 在 task 中写一串 shell script
- 把 task 添加到 login items 中,每次系统重启后会执行这个 Automator task,自动 ssh-add 所有的私钥。
搞定!