使用SSH密钥
From ArchWiki
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
)并且设置.ssh
和authorized_keys
的权限.
登出并重新登录。由于你选择了路线A,你不需要输入“短句密码”(passphrase),你的使命就完成了...
...线路B继续...
现在有没有什么可以使这条路线像没有“短句密码”密钥一样简单的东西呢?这个神奇的词就是ssh-agent.. 基本上,每次在每个需要你输入短句密码的会话中你都可以输入这个: ssh-agent
。 ssh-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 --help
或man 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可以找到。然后就按照下面的进行:
- 在Linux系统的电脑上用ssh-keygen产生密钥对(你可以通过PuTTY使用一般的username/password登录)
- 将公钥放到~/.ssh/authorized_keys
- 将私钥移到Windows机器上
- 用PuTTYgen载入私钥并点击Save private key。这将会把私钥转化成PuTTY能用的。
- 启动PuTTY,转到SSH->Auth并找到私钥。然后你就可以连接到你的Linux机器上了。你将被提示输入你的用户名和短句密码(如果你在产生密钥的时候选择了输入的话)。
注意:颠倒了这个过程,先用PuTTY产生密钥对,再用ssh-keygen转换的话,是不行的。
有用的链接和信息
- SSH with Keys HOWTO
- HOWTO: set up ssh keys
- OpenSSH key management, Part 1
- OpenSSH key management, Part 2
- OpenSSH key management, Part 3
- Getting started with SSH
- Manual Pages: ssh-keygen(1)
- Sharing SSH keys on 2 linux servers
- How to set up SSH keys: Frustration with "Server refused our key" [PuTTY]
- Securing your secure shell (SSH) service