SSH 密钥登录
SSH 默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是更好的解决方案。
快速开始
0.安装ssh
sudo apt-get install openssh-server
# 启动服务
sudo /etc/init.d/ssh start
# 设置开机自启
sudo systemctl enable ssh
启动ssh服务 sudo /etc/init.d/ssh start 设置开机自启动 sudo systemctl enable ssh 关闭ssh开机自动启动命令 sudo systemctl disable ssh 单次开启ssh sudo systemctl start ssh 单次关闭ssh sudo systemctl stop ssh
1.生成密钥
在本机上用 powershell 运行下列命令,没有ssh 的请点这里
ssh-keygen -t rsa
2.提交密钥
本机计算机上,执行下面的命令。
cat ~/.ssh/id_rsa.pub | ssh -l user host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
上面示例中,user host
要替换成你所要登录的用户名和主机名。
注意,authorized_keys
文件的权限要设为644
,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。
chmod 644 ~/.ssh/authorized_keys
只要公钥上传到服务器,下次登录时,OpenSSH 就会自动采用密钥登录,不再提示输入密码。
ssh -l username shell.isp.com
Enter passphrase for key '/home/you/.ssh/id_dsa': ************
Last login: Mon Mar 24 02:17:27 2014 from ex.ample.com
shell.isp.com>
详细教程
修改配置
修改 /etc/ssh/sshd_config
文件即可。
具体文件说明参考
密钥登录的过程
SSH 密钥登录分为以下的步骤。
预备步骤,客户端通过ssh-keygen
生成自己的公钥和私钥。
第一步,手动将客户端的公钥放入远程服务器的指定位置。
第二步,客户端向服务器发起 SSH 登录的请求。
第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
ssh-key
命令:生成密钥
基本用法
密钥登录时,首先需要生成公钥和私钥。OpenSSH 提供了一个工具程序ssh-keygen
命令,用来生成密钥。
直接输入ssh-keygen
,程序会询问一系列问题,然后生成密钥。
通常做法是使用-t
参数,指定密钥的加密算法。
上面示例中,-t
参数用来指定密钥的加密算法,一般会选择dsa
算法或rsa
算法。注意,这个参数没有默认值。
输入上面的命令以后,ssh-keygen
会要求用户回答一些问题。
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_dsa): press ENTER
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: ********
Your identification has been saved in /home/username/.ssh/id_dsa.
Your public key has been saved in /home/username/.ssh/id_dsa.pub.
The key fingerprint is:
14:ba:06:98:a8:98:ad:27:b5:ce:55:85:ec:64:37:19 [email protected]
上面示例中,执行ssh-keygen
命令以后,会出现第一个问题,询问密钥保存的文件名,默认是~/.ssh/id_dsa
文件,这个是私钥的文件名,对应的公钥文件~/.ssh/id_dsa.pub
是自动生成的。用户的密钥一般都放在主目录的.ssh
目录里面。
如果选择rsa
算法,生成的密钥文件默认就会是~/.ssh/id_rsa
(私钥)和~/.ssh/id_rsa.pub
(公钥)。
接着,就会是第二个问题,询问是否要为私钥文件设定密码保护(passphrase)。这样的话,即使入侵者拿到私钥,还是需要破解密码。如果为了方便,不想设定密码保护,可以直接按回车键,密码就会为空。后面还会让你再输入一次密码,两次输入必须一致。注意,这里“密码”的英文单词是 passphrase,这是为了避免与 Linux 账户的密码单词 password 混淆,表示这不是用户系统账户的密码。
最后,就会生成私钥和公钥,屏幕上还会给出公钥的指纹,以及当前的用户名和主机名作为注释,用来识别密钥的来源。
公钥文件和私钥文件都是文本文件,可以用文本编辑器看一下它们的内容。公钥文件的内容类似下面这样。
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvpB4lUbAaEbh9u6HLig7amsfywD4fqSZq2ikACIUBn3GyRPfeF93l/
weQh702ofXbDydZAKMcDvBJqRhUotQUwqV6HJxqoqPDlPGUUyo8RDIkLUIPRyq
ypZxmK9aCXokFiHoGCXfQ9imUP/w/jfqb9ByDtG97tUJF6nFMP5WzhM= [email protected]
上面示例中,末尾的[email protected]
是公钥的注释,用来识别不同的公钥,表示这是哪台主机(shell.isp.com
)的哪个用户(username
)的公钥,不是必需项。
注意,公钥只有一行。因为它太长了,所以上面分成三行显示。
下面的命令可以列出用户所有的公钥。
生成密钥以后,建议修改它们的权限,防止其他人读取。
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub
配置项
ssh-keygen
的命令行配置项,主要有下面这些。
(1)-b
-b
参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。
一般来说,-b
至少应该是1024
,更安全一些可以设为2048
或者更高。
(2)-C
-C
参数可以为密钥文件指定新的注释,格式为username@host
。
下面命令生成一个4096位 RSA 加密算法的密钥对,并且给出了用户名和主机名。
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
(3)-f
-f
参数指定生成的私钥文件。
$ ssh-keygen -t dsa -f mykey
上面命令会在当前目录生成私钥文件mykey
和公钥文件mykey.pub
。
(4)-F
-F
参数检查某个主机名是否在known_hosts
文件里面。
$ ssh-keygen -F example.com
(5)-N
-N
参数用于指定私钥的密码(passphrase)。
$ ssh-keygen -t dsa -N secretword
(6)-p
-p
参数用于重新指定私钥的密码(passphrase)。它与-N
的不同之处在于,新密码不在命令中指定,而是执行后再输入。ssh 先要求输入旧密码,然后要求输入两遍新密码。
(7)-R
-R
参数将指定的主机公钥指纹移出known_hosts
文件。
$ ssh-keygen -R example.com
(8)-t
-t
参数用于指定生成密钥的加密算法,一般为dsa
或rsa
签名过程
手动上传公钥
生成密钥以后,公钥必须上传到服务器,才能使用公钥登录。
OpenSSH 规定,用户公钥保存在服务器的~/.ssh/authorized_keys
文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys
文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。
- 用户可以手动编辑该文件,把公钥粘贴进去。
- 也可以在本机计算机上,执行下面的命令。
cat ~/.ssh/id_rsa.pub | ssh -l user host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
上面示例中,user host
要替换成你所要登录的用户名和主机名。
注意,authorized_keys
文件的权限要设为644
,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。
chmod 644 ~/.ssh/authorized_keys
只要公钥上传到服务器,下次登录时,OpenSSH 就会自动采用密钥登录,不再提示输入密码。
ssh -l username shell.isp.com
Enter passphrase for key '/home/you/.ssh/id_dsa': ************
Last login: Mon Mar 24 02:17:27 2014 from ex.ample.com
shell.isp.com>
上面例子中,SSH 客户端使用私钥之前,会要求用户输入密码(passphrase),用来解开私钥。