ssh是用来远程登陆linux系统的默认工具,使用方便,安全性强。

但当用户需要同时管理很多台机器,或者需要多次重复登陆某台机器的时候,每次输入密码(尤其是强密码)就成为了很蛋疼的一个操作。

ssh为用户提供了一种方便且安全的解决方案,即通过密钥来进行认证客户机,使得客户机在把自己的公钥添加到服务器端的受信任列表后,可以无密码登陆该远程机器。

该工具即为ssh-keygen

ssh-keygen有N多可以附加的参数,其中最常用为-t,用来设置生成密钥所使用的算法类型(rsa/dsa),可通过以下命令实现:


1
2
ssh-keygen -t rsa
ssh-keygen -t dsa

如果没有附加-t参数,则默认为使用rsa加密。

执行ssh-keygen命令会出现如下提示:


1
2
3
4
5
6
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

其中第二行是让你输入保存的路径,一般为默认即可。第三、四行,则是让你输入你的密钥的passphrase,即为密码一样的东西,目的是为了对密钥对的私钥进行加密,可以降低私钥被盗用的风险。

以默认生成路径为例,你可以在~/.ssh/目录下看到id_rsa和id_rsa.pub两个文件,其中id_rsa为私钥,id_rsa.pub为公钥。为了实现无密码登陆的目的,我们还需要将id_rsa.pub的内容添加到服务器端的/root/.ssh/authorized_keys文件中,方法就不做赘述了。

[update]: authorized_keys的属性需要设置为600,否则会有问题。

在操作完成后尝试进行ssh连接,会发现如果在之前生成密钥对的时候设置了passphrase,这时会要求我们输入密码短语。为了实现免密码登陆,还需要进行两步操作:


1
2
eval `ssh-agent`
ssh-add

然后按要求输入passphrase即可。

下面部分参考自http://www.newsmth.net/pc/pccon.php?id=1363&nid=130053

passphrase是用来对密钥对的私钥进行加密的,不会在网络上传播。

缺点:最后两步必需每次登录都执行。因为3设置环境变量,不同的登录是不同的。但对于shell,可以放在.bash_profile中执行,对于cron脚本,也可以在脚本中设置执行;4更是致命的,因为它是交互的,无法自定执行。

解决:只好设置passphrase为空,这样最后两步也就省掉了。

附:

ssh-agent 程序如同一个看门人,它根据需要安全地提供对安全密钥的访问。ssh-agent 启动后,它就会在后台运行,并且可以由 ssh 和 scp 程序等其他 OpenSSH 应用程序所使用。这就使得 ssh 程序可以请求一个已经解密了的密钥,而不是在每次需要时向您询问私钥的安全口令。