使用SSH密钥

From ArchWiki

Jump to: navigation, search


i18n
简体中文
English
Русский


Contents

使用SSH密钥连接服务器

为什么要用这些密钥?


使用ssh密钥,准确地说有公钥和私钥,是一个用同样的密码或不用密码连接一台或一群服务器简单的方法。你将会喜欢这种password/ssh-agent的组合!

第一步:产生密钥

mith@middleearth||[[~]]:~ > ssh-keygen -b 1024 -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/mith/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mith/.ssh/id_dsa.
Your public key has been saved in /home/mith/.ssh/id_dsa.pub.
The key fingerprint is:
x6:68:xx:93:98:8x:87:95:7x:2x:4x:x9:81:xx:56:94 mith@middleearth
mith@middleearth||[[~]]:~ >


我们做了什么?我们用 ssh-keygen 命令产生了一个1024bit长的(-b 1024)公共/私有dsa(-t dsa) 密钥对. 你也可以创造一个rsa密钥(-t rsa). 你可以让bit长度参数为空(默认的就是1024).
如果你不喜欢标准的密钥的名字,你可以指定一个名字用 -f name 参数。
在这个过程中你被询问:将这些密钥存在哪?我把它放在了标准的目录下。 你也会被问到“短句密码”(passphrase,使用一个短语或着一句话作为密码输入,再由系统内部的加密或是散列算法生成虚拟密码后,进行下一步的认证。好处是,容易记忆,不易被破解。例如:Iseeapreetygirl).
现在这儿有两条路你可以走,"选择你的命运" (就像从Mortal Kombat来的人会说的):
A) 短的, 容易但是不安全: 不使用“短句密码”, 更容易访问你的远程服务器, 会让你有有人在偷盗你的私钥的幻想
B) 有一点长, 有一点不舒服但是安全的方法: 使用“短句密码”, 使用ssh-agent你会觉得更安全。

第二步:拷贝你的公钥到远程服务器上(对于线路A和B是一样的)

mith@middleearth||[[~]]:~ >  scp .ssh/id_dsa.pub mith@metawire.org:


通过scp复制公钥 (id_dsa.pub) 到你的远程服务器 (注意在服务器路径的最后的 : ). 这种方式文件会被复制到用户的家目录下,但是你也可以指定其它的目录.

第2+3步 - 简单的方法

mith@middleearth||[[~]]:~ > ssh-copy-id -i .ssh/id_dsa.pub mith@metawire.org

完成!

注意: 因为两台机器上的用户名相同,所以你可以在命令中忽略它(例如:metawire.org替代mith@metawire.org)。

第三步: 登录到远程主机上并且把你的密钥就行到正确的地方{对于线路A和B是一样的}

mith@middleearth||[[~]]:~ > ssh metawire.org
mith@metawire.org's password:
-bash-2.05b$ mkdir .ssh/
-bash-2.05b$ cat id_dsa.pub >> .ssh/authorized_keys
-bash-2.05b$ rm id_dsa.pub
-bash-2.05b$ chmod 700 .ssh
-bash-2.05b$ chmod 600 .ssh/authorized_keys


我们连接我们的服务器并用cat命令把id_dsa.pub中的内容加到authorized_keys隐藏的.ssh目录中。 注意: 为了避免产生 .ssh目录不存在的错误,你也可以简单地创建它(mkdir .ssh).
接着我们删除公钥(rm id_dsa.pub)并且设置.sshauthorized_keys的权限.
登出并重新登录。由于你选择了路线A,你不需要输入“短句密码”(passphrase),你的使命就完成了...

...线路B继续...

现在有没有什么可以使这条路线像没有“短句密码”密钥一样简单的东西呢?这个神奇的词就是ssh-agent.. 基本上,每次在每个需要你输入短句密码的会话中你都可以输入这个: ssh-agentssh-agent是包含在openssh包中的,所以不会有什么麻烦...

mith@middleearth||[[~]]:~ > ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2148; export SSH_AGENT_PID;
echo Agent pid 2148;


当你运行ssh-agent,它会打印出一些它将使用的环境变量,没关第,让它使用它们就好了。

mith@middleearth||[[~]]:~ > eval `ssh-agent`
Agent pid 2157

当然,你看到的进程id可能是不同的。将 eval `ssh-agent`添加到.bashrc 是一个选择,这样每次它启动时都会创建一个新的shell。
既然ssh-agent已经在运行了,我们需要告诉它我们有私钥以及私钥在哪。

mith@middleearth||[[~]]:~ > ssh-add .ssh/id_dsa
Enter passphrase for .ssh/id_dsa:
Identity added: .ssh/id_dsa (.ssh/id_dsa)


这里要求输入短句密码,输入它就是了。现在我们就可以不用输入密码登录远程服务器了,而私钥是受到密码保护的。很甜蜜哈?唯一的不好的就是每次打开一个新的控制台(shell)都需要创建一个新的ssh-agent实例,这意味着你每次都要在控制台中运行 ssh-add。 There is a workaround to that with a program or rather a script called keychain which is covered in the next section.

使用密钥链(keychain)

Keychain 管理一个或更多指定的私钥。当被初始化之后,它会私钥的“短句密码”并保存。这样你的私钥是密码保护而且你不用一次又一次的输入你的密码了。

从extra repo中安装密钥链:

# pacman -S keychain

编辑你的~/.bashrc,加入这样一行:

/usr/bin/keychain -Q -q ~/.ssh/id_dsa
[[ -f $HOME/.keychain/$HOSTNAME-sh ]] && source $HOME/.keychain/$HOSTNAME-sh

如果需要, 将~/.ssh/id_dsa替代为~/.ssh/id_rsa. 因为这样将使用non-Bash shell, 查看帮助,使用 keychain --helpman keychain ,以便得到更详细的关于其它shells的内容.

关掉你的shell,然后重新打开它。密钥链就会出现,如果你这是第一次运行的话它就会询问你指定私钥的“短句密码”。

使用ssh-agent和x11-ssh-askpass

你每次启动一个新的会话都要启动一次ssh-agent。ssh-agent每次将随着X会话的结束而关闭。
安装x11-ssh-askpass,它在你每次打开一个新的会话的时候询问你的“短句密码”。
sudo pacman -S x11-ssh-askpass

把这个预先加到你的 ~/.xsession中 :

eval `/usr/bin/ssh-agent`
SSH_ASKPASS=/usr/lib/openssh/x11-ssh-askpass ssh-add < /dev/null
# then the end of the file with for example "exec dwm"

SSH连接控制

在 ~/.ssh/config中,加入下面的行:

host *
   controlmaster auto
   controlpath /tmp/ssh-%r@%h:%p

这样,当你开始一个SSH连接的时候,设置了"master control" 插口(socket)。The socket is named based on the controlpath setting (%r = username, %h = hostname, %p = port).

This master socket is used for each successive connection after the first, as long as one connection still exists. That is, if you connect via ssh myuser@myhost.com, a socket named /tmp/ssh-myuser@myhost.com:22 is created. If you then ssh again to the same host, the socket is found and the remote ssh session is told to spawn a new shell. This shell does not require a login, and spawns immediately, as you're already logged in.

PuTTY

上面的过程对于使用PuTTY的用户来说将会有点复杂,因为在windows下PuTTY将不能直接用ssh-keygen。私钥需要用PuTTYgen转化,这在here可以找到。然后就按照下面的进行:

  1. 在Linux系统的电脑上用ssh-keygen产生密钥对(你可以通过PuTTY使用一般的username/password登录)
  2. 将公钥放到~/.ssh/authorized_keys
  3. 将私钥移到Windows机器上
  4. 用PuTTYgen载入私钥并点击Save private key。这将会把私钥转化成PuTTY能用的。
  5. 启动PuTTY,转到SSH->Auth并找到私钥。然后你就可以连接到你的Linux机器上了。你将被提示输入你的用户名和短句密码(如果你在产生密钥的时候选择了输入的话)。

注意:颠倒了这个过程,先用PuTTY产生密钥对,再用ssh-keygen转换的话,是不行的。

有用的链接和信息

Personal tools