服务器 名字为s 客户端 名字为c

1 生成密钥对,简便起见,在c上来生成,一下操作我用的都是root,你也可以用普通用户
ssh-keygen -t dsa
ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
c3:84:4d:24:64:c4:9d:2b:76:1a:6f:7e:dc:1a:60:23 root@fedora3
其中id_dsa是私钥,id_dsa.pub是公钥,私钥保留在客户端本地,公钥要复制到你要ssh登录的服务器上
2 配置公钥
在c上复制公钥到服务器a
scp ~/.ssh/id_dsa.pub a:/tmp
ssh a
cat /tmp/id_dsa.pub >> ~/.ssh/authorized_keys
rm -rf /tmp/id_dsa.pub
这时候可以用密钥对认证从c登录a了
3配置无密码登录
在客户端c上执行
eval `ssh-agent`
Agent pid 6054
`是TAB键上面那个键不是单引号
然后执行
ssh-add
ssh-add
Enter passphrase for /root/.ssh/id_dsa: 输入密钥对的密码
Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa)

这时你就可以从c用ssh无密码访问a了

在客户端

这个问题比较有代表性,虽然写的比较简单,但是还是+精吧,省得以后再有人问
参考
man ssh-add
man ssh-keygen
man ssh-agent

使用公钥/私钥进行安全的远程访问

在数字安全的上下文中,密钥(key)指的是用来加密或解密其他数据片断的一个数据片断。公钥私钥模式的有趣之处在于,使用公钥加密的数据,只有用相应的私钥才可以解密。您可以自由地发布一个公钥,这样别人就可以对发送给您的消息进行加密。公钥/私钥模式彻底改变了数字安全的原因之一是,发送者和接收者不必再共享一个通用的密码。除了其他方面的贡献,公钥/私钥加密使用电子商务和其他安全传输成为可能。在本文中,我们将创建并使用公钥和私钥来创建一个非常安全的分布式备份解决方案。

要进行备份过程的每台机器都必须运行 OpenSSH 安全 shell 服务(sshd),同时让 22 端口可以通过任何内部防火墙被访问。如果您访问远程的服务器,那么很有可能您正在使用安全 shell。

我们的目标将是,不需要人工提供密码就可以安全地访问机器。一些人认为最简单的办法是设置无密码的访问:不要这样做。这样做不安全。不用那样,本文中我们将使用的方法可能会占用您大约一个小时的时间,建立起一个与使用“无密码”帐号同样方便的系统 —— 不过它是公认非常安全的。

让我们首先确保 OpenSSH 已经安装,接下来查看它的版本号。完成本文时,最新的发行的 OpenSSH 是 2004 年 2 月 24 日发布的版本 3.8。您应该考虑使用一个较新的而且稳定的发布版本,至少所用的版本应该要比版本 2.x 新。访问 OpenSSH Security 网页以获得关于特定旧版本的缺陷的细节。到目前为止,OpenSSH 是非常稳定的,而且已经证明不存在其他 SSH 工具所报告的很多缺陷。

在 shell 提示符中,输入 ssh 并给出重要的 V 选项来检查版本号:
$ ssh -V
OpenSSH_3.5p1, SSH protocols 1.5/2.0, OpenSSL 0x0090701f

如果 ssh 返回的版本号大于 2.x,则机器处于相对良好的状态。无论如何,建议您所有的软件都使用最新的稳定版本,这对于安全相关的软件来说尤其重要。

我们的第一个步骤是,使用将会有特权访问服务器 1 和 2 的帐号登录到离线存储服务器机器(见图 1)。
$ ssh accountname@somedomain.com

登录到离线存储服务器以后,使用 ssh-keygen 程序并给出 -t dsa 选项来创建一个公钥/密钥对。 -t 选项是必须的,用来指定我们要生成的密钥类型。我们将使用数字签名算法(Digital Signature Algorithm,DSA),它让我们可以使用更新的 SSH2 协议。参阅 ssh-keygen 手册以获得更多细节。

在 ssh-keygen 执行的过程中,在询问您口令(passphrase)之前,将提示您输入 ssh 密钥存储的位置。当询问在何处存储密钥时只需要按下回车键,然后 ssh-keygen 程序将创建一个名为 .ssh 的隐藏目录(如果原来不存在),以及两个文件,一个公钥文件和一个私钥文件。

ssh-keygen 的一个有趣特性是,当提示输入一个口令时,它让您可以只是简单地按下回车键。如果您没有给出口令,那么 ssh-keygen 将生成没有加密的密钥!如您所想,这不是个好主意。当要求输入口令时,确保输入一个足够长的字符消息,最好包含混合字符而不仅仅是一个简单的密码字符串。

清单 3. 永远选择好的口令



[offsite]:$ ssh-keygen -t dsa
  Generating public/private dsa key pair.
  Enter file in which to save the key (/home/accountname/.ssh/id_dsa):
  Enter passphrase (empty for no passphrase): (enter passphrase)
  Enter same passphrase again: (enter passphrase)
  Your identification has been saved in /home/accountname/.ssh/id_dsa.
  Your public key has been saved in /home/accountname/.ssh/id_dsa.pub.
  The key fingerprint is:
  7e:5e:b2:f2:d4:54:58:6a:fa:6b:52:9c:da:a8:53:1b accountname@offsite



由于 ssh-keygen 生成的 .ssh 目录是一个隐藏的“dot”目录,所以要给 ls 命令传入一个 -a 选项来查看新创建的目录:



[offsite]$ ls -a
. .. .bash_logout .bash_profile .bashrc .emacs .gtkrc .ssh



进入隐藏的 .ssh 目录并列出其内容:



[offsite]$ cd .ssh
[offsite]$ ls -lrt
id_dsa id_dsa.pub



现在,在隐藏的 .ssh 目录中,我们已经拥有了一个私钥(id_dsa)和一个公钥(id_dsa.pub)。您可以使用 vi 或 emacs 等文本编辑工具或者简单地使用 less 或 cat 命令来分析每个密钥文件的内容。您将看到由混合字符构成的内容已经经过了 base64 编码。

然后,我们需要将公钥拷贝并安装到服务器 1 和 2 上。不要使用 ftp。更合理的是,使用安全拷贝程序来将公钥传送到每一台远程机器上。

清单 4. 将公钥安装到远程服务器上



[offsite]$ scp .ssh/id_dsa.pub accountname@server1.com:offsite.pub
  accountname@server1.com's password: (enter password, not new
  passphrase!)
  id_dsa.pub 100% |*****************************| 614 00:00

  [offsite]$ scp .ssh/id_dsa.pub accountname@server2.com:offsite.pub
  accountname@server2.com's password: (enter password, not new
  passphrase!)
  id_dsa.pub 100% |*****************************| 614 00:00



在安装完新的公钥后,我们就可以使用创建私钥和公钥时指定的口令来登录到每一台机器。现在,登录到每台机器,并将 offsite.pub 文件的内容附加到一个名为 authorized_keys 的文件中,这个文件存储在每台远程机器的 .ssh 目录下。我们可以使用一个文本编辑器或者简单地使用 cat 命令来将 offsite.pub 文件的内容附加到 authorized_keys 文件:

清单 5. 将 offsite.pub 添加到已授权密钥列表



[offsite]$ ssh accountname@server1.com
  accountname@server1.com's password: (enter password, not new
  passphrase!)
  [server1]$ cat offsite.pub >> ./ssh/authorized_keys



接下来的步骤是考虑一些额外的安全性。首先,我们修改 .ssh 的访问权限,以使得只有所有者有读、写和执行的权限。然后,我们确保 authorized_keys 文件只能由所有者来访问。最后,将先前上传的 offsite.pub 密钥文件删除,因为再也不需要它了。确保设置适当的访问权限很重要,因为 OpenSSH 服务器可能会拒绝使用具有不安全访问权限的密钥。

清单 6. 使用 chmod 修改权限



[server1]$ chmod 700 .ssh
  [server1]$ chmod 600 ./ssh/authorized_keys
  [server1]$ rm offsite.pub
  [server1]$ exit



在服务器 2 上完成同样的步骤后,我们就可以返回到离线存储机器上来测试新的口令类型的访问。在离线服务器上您可以输入下面的内容:
[offsite]$ ssh -v accountname@server1.com

在检验您的帐号现在可以使用新的口令而不是原来的密码来访问远程的服务器时,使用 -v 或 verbose 标记选项来显示调试信息。调试输出除了能让您在一个高的层面上观察到认证过程是如何工作的之外,还可以显示出您可以以其他方式无法得到的重要信息。在以后的连接中您可能并不需要指定 -v 标记;但是在测试连接时它相当有用。