- ssh身份认证阶段中解释过,ssh认证的过程其实是客户端(ssh命令端)读取自己的私钥并推导出指纹发送给服务端(sshd端),服务端也使用自己保存的公钥推导出指纹进行对比,
如果指纹相同说明服务端的公钥和客户端的私钥是配对的 - 如下是公钥、私钥的指纹计算方式
$ ssh-keygen -l -f ~/.ssh/id_rsa_2
2048 2c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52 root@xuexi.longshuai.com (RSA)
$ ssh-keygen -l -f ~/.ssh/id_rsa_2.pub
2048 2c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52 root@xuexi.longshuai.com (RSA)
生成密钥 ssh-keygen
-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型【它支持RSA和DSA两种认证密钥】
基本权限设定
-
生成密钥以后,建议修改它们的权限,防止其他人读取
chmod 600 ~/.ssh/id_rsa.* -
设置authorized_keys权限
chmod 600 authorized_keys -
设置.ssh目录权限
chmod 700 -R .ssh
要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效
上传公钥
- 手动上传
cat id_dsa.pub >> ~/.ssh/authorized_keys - 自动上传公钥
ssh-copy-id -i./.ssh/公钥 user@host
ssh-agent解决密钥多的情况
- ssh-agent的工作是依赖于环境变量SSH_AUTH_SOCK和SSH_AGENT_PID的,不同用户,不同终端,只要没有和这两个环境变量配对的ssh-agent,这个agent进程就不可使用。要想使用某个agent,
就必须在自己的shell中先设置好这两个环境变量。$ tree /tmp/ssh*
/tmp/ssh-q3tM0FzpCcdU
└── agent.28629
/tmp/ssh-SkKrrkK6qLDq
└── agent.28817
export SSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629
export SSH_AGENT_PID=28630
+ 使用ssh-agent后,可以通过ssh-add命令向ssh-agent注册本机的私钥,ssh-agent会自动推导出这个私钥的指纹(实际上是ssh-add计算的)保存在自己的小本本里(内存),以后只要ssh连接某主机(某用户),
将自动转发给ssh-agent,ssh-agent将自动从它的小本本里查找私钥的指纹并将其发送给服务端(sshd端)。如此一来,ssh客户端就无需再指定使用哪个私钥文件去连接
+ ssh并非一定支持ssh-agent转发的连接。
+ 要使用ssh-agent的转发功能,
+ 需要在sshd_config中开启AllowAgentForwarding选项,
+ 需要在ssh_config中开启ForwardAgent选项
ssh-agent
-a 指定ssh-agent运行时绑定的Unix Domain套接字路径,默认是$TMPDIR/ssh-xxx/agent.<ppid>
-c:生成C-shell风格的命令输出。
-d:调试模式。
-k:把ssh-agent进程杀掉。
-s:生成Bourne shell 风格的命令输出。
-t life:设置默认值添加到代理人的身份最大寿命。
ssh-add
-D: 删除ssh-agent中所有私钥(指纹)
-d: key_file删除指定私钥
-L: 列出agent当前主机上所有公钥参数,即公钥文件中的内容
-l: 列出agent当前已保存的指纹信息
-t: 设置私钥(指纹)的有效期。默认单位为秒,可以指定m(分钟)、h(小时)、d(天)、w(周)
-x: 使用一个密码将agent锁起来(lock),锁起来的agent将不再提供任何服务
-X: 解锁agent
### 关闭密码登录[为了安全性,启用密钥登录之后,最好关闭服务器的密码登录。]
+ sshd 的配置文件/etc/ssh/sshd_config,将PasswordAuthentication这一项设为no。