OpenSSH 特性之一是它能够使用基于一对互补的数字式密钥的 RSA 和 DSA 认证协议来认证用户。
RSA 和 DSA 认证承诺不必提供密码就能够同远程系统建立连接,这是它的主要魅力之一。
虽然这非常吸引人,但是 OpenSSH 的新用户们常常以一种快速却不完善的方式配置 RSA/DSA,
结果虽然实现了无密码登录,却也在此过程中开了一个很大的安全漏洞
RSA 和 DSA 认证承诺不必提供密码就能够同远程系统建立连接,这是它的主要魅力之一。
虽然这非常吸引人,但是 OpenSSH 的新用户们常常以一种快速却不完善的方式配置 RSA/DSA,
结果虽然实现了无密码登录,却也在此过程中开了一个很大的安全漏洞
RSA/DSA 密钥的工作原理
1.生成一对密钥,一把专用密钥和一把公用密钥,公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。
公用密钥只能用于加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。
1.生成一对密钥,一把专用密钥和一把公用密钥,公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。
公用密钥只能用于加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。
2.公用密钥拷贝到 remotebox,把它放在一个专门的文件(~/.ssh/authorized_keys)里
3.ssh 告诉 remotebox 的 sshd 它想使用 RSA 认证协议。Remotebox 的 sshd 会生成一个随机数,
并用公用密钥对这个随机数进行加密。然后, sshd 把加密了的随机数发回给正在 localbox 上运行的 ssh。
接下来, ssh 用专用密钥对这个随机数进行解密后,再把它发回给 remotebox。 sshd 得出结论,既然持有匹配的专用密钥,
就应当允许登录
并用公用密钥对这个随机数进行加密。然后, sshd 把加密了的随机数发回给正在 localbox 上运行的 ssh。
接下来, ssh 用专用密钥对这个随机数进行解密后,再把它发回给 remotebox。 sshd 得出结论,既然持有匹配的专用密钥,
就应当允许登录
注意事项
ssh 被设置成了文件权限允许除用户之外的任何人读取密钥,就打印出一条大大的警告消息。
其次,用 ssh-keygen 创建公用/专用密钥对的时候,ssh-keygen 会要求输入一个密码短语。
ssh 被设置成了文件权限允许除用户之外的任何人读取密钥,就打印出一条大大的警告消息。
其次,用 ssh-keygen 创建公用/专用密钥对的时候,ssh-keygen 会要求输入一个密码短语。
错误的做法
密码短语设置为空,以实现无密码认证。
密码短语设置为空,以实现无密码认证。
操作步骤:
1.RSA 密钥对的生成
% ssh-keygen
1.RSA 密钥对的生成
% ssh-keygen
2.RSA 公用密钥的安装
% scp ~/.ssh/identity.pub xxxx@remotebox
% cat identity.pub >> ~/.ssh/authorized_keys
% exit
% scp ~/.ssh/identity.pub xxxx@remotebox
% cat identity.pub >> ~/.ssh/authorized_keys
% exit
3.错误排除:
第一,尝试通过输入 ssh -1 xxxx@remotebox 登录。它会让 ssh 只应用 ssh 协议版本 1
第二,确认 /etc/ssh/ssh_config 里没有写着这么一行 RSAAuthentication no。如果有的话,请在前面加上一个“#”把这行注释掉
第一,尝试通过输入 ssh -1 xxxx@remotebox 登录。它会让 ssh 只应用 ssh 协议版本 1
第二,确认 /etc/ssh/ssh_config 里没有写着这么一行 RSAAuthentication no。如果有的话,请在前面加上一个“#”把这行注释掉
DSA 密钥的生成
ssh 协议的版本 1 使用的是 RSA 密钥,而 DSA 密钥却用于协议级 2。
% ssh-keygen -t dsa
ssh 协议的版本 1 使用的是 RSA 密钥,而 DSA 密钥却用于协议级 2。
% ssh-keygen -t dsa
DSA 公用密钥的安装
~/.ssh/authorized_keys2
~/.ssh/authorized_keys2
介绍 ssh-agent
不同于 ssh,ssh-agent 是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存。
对于 ssh-agent,您只要使用 ssh-add 把专用密钥添加到 ssh-agent 的高速缓存中。这是个一次性过程;用过 ssh-add 之后,ssh 将从 ssh-agent 获取您的专用密钥,而不会提示要密码短语来烦您了。
不同于 ssh,ssh-agent 是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存。
对于 ssh-agent,您只要使用 ssh-add 把专用密钥添加到 ssh-agent 的高速缓存中。这是个一次性过程;用过 ssh-add 之后,ssh 将从 ssh-agent 获取您的专用密钥,而不会提示要密码短语来烦您了。
使用 ssh-agent
% ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XX4LkMJS/agent.26916; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26917; export SSH_AGENT_PID;
echo Agent pid 26917;
% ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XX4LkMJS/agent.26916; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26917; export SSH_AGENT_PID;
echo Agent pid 26917;
使之确定,我们可以象下面这样调用 ssh-agent:
eval `ssh-agent`
eval `ssh-agent`
使用 ssh-add
把 ~/.ssh/identity 专用 RSA 密钥添加到 ssh-agent 的高速缓存中:
# ssh-add ~/.ssh/identity
把 ~/.ssh/identity 专用 RSA 密钥添加到 ssh-agent 的高速缓存中:
# ssh-add ~/.ssh/identity
ssh-agent 的不足之处
首先,~/.bash_profile 中的 eval `ssh-agent` 使每次登录会话都会启动一个新的 ssh-agent 副本;
每次新打开控制台都需要键入密码短语。
同 cron 作业不兼容。
每次新打开控制台都需要键入密码短语。
同 cron 作业不兼容。
解决方法
使用keychain
使用keychain