今天来唠唠SSH秘钥验证方式的使用,包括如何创建秘钥、如何注册秘钥、如何使用秘钥,涉及到两个命令:ssh-keygen、ssh-copy-id。
创建秘钥
我们使用ssh-keygen命令来创建秘钥,基本用法如下:
ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa]
[-N new_passphrase] [-C comment] [-f output_keyfile]
举个例子,下面的命令将生成一个RSA秘钥,长度为4096-bit,备注信息“master@simaek.com”,秘钥保存为simaek。
执行后会提示输入秘钥的密码(Enter passphrase),在使用秘钥的时候需要这个密码验证,当然如果不想使用密码,可以留空。
ssh-keygen -t rsa -b 4096 -C "master@simaek.com" -f simaek
完成后会在-f
指定的路径生成秘钥,生成的秘钥包含一个私钥和一个公钥,-f
指定的是私钥的名字,而公钥名字与私钥一致,但多了一个.pub
拓展名,这个设定我使用ssh-copy-id分发秘钥的时候坑了我一把。
注册秘钥
根据sshd_config的配置,服务端公钥默认保存在用户主目录的.ssh/authorized_keys
文件中,如果你从来没有使用过SSH,那么这个文件是不存在的,甚至.ssh
目录都是不存在的,需要自己创建。
方法1、将公钥追加到.ssh/authorized_keys
文件中
首先检查一下.ssh
目录和authorized_keys
文件是不是都存在,如果缺少的话自己创建,需要注意的是,.ssh
文件夹权限必须是700,authorized_keys
文件权限必须是600!
# 缺少.ssh
mkdir ~/.ssh
chmod 700 ~/.ssh
# 缺少authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
然后将公钥上传到服务器上,使用cat命令追加公钥到配置文件中:
cat simaek.pub >> ~/.ssh/authorized_keys
当然你也可以使用文本编辑器打开配置文件,复制粘贴公钥文本。
方法2、使用ssh-copy-id分发秘钥
这个命令用于将公钥分发到远程主机上,基本用法如下:
ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port]
[[-o <ssh -o options>] ...] [user@]hostname
举个例子,下面的命令将公钥simaek.pub追加到主机192.168.88.88上的root用户下ssh-copy-id -i simaek -p 2020 root@192.168.88.88上的root用户下。ssh-copy-id使用SSH进行通讯,所以会提示你输入密码,如果你像我一样不是使用的默认端口号22,需要使用-p
参数自定义端口号;使用默认端口号可以不加这个参数。
ssh-copy-id -i simaek -p 2020 root@192.168.88.88
之前说这里有坑,是这样的,我已经有了一个秘钥对,所以直接拿过来用,并没有重新生成,我只上传了公钥到我的服务器上,然后我希望通过这个ssh-copy-id将这个公钥分发到另外几台服务器上,但是总是报如下错误:
ERROR: failed to open ID file './simaek': No such file or directory
原因就在于这里的-i
参数,大家都说这个参数指定公钥文件,但实际上这个参数指定的是秘钥对的名字,意思就是需要同名的私钥和公钥。由于我只上传了公钥,ssh-copy-id找不到私钥,所以报错。对比一下这两个命令
ssh-copy-id -i simaek -p 2020 root@192.168.88.88
ssh-copy-id -i simaek.pub -p 2020 root@192.168.88.88
上面的这两条命令都是正确的,如果你指定的秘钥名字带有.pub
后缀,它就会知道你私钥的名字(去掉拓展名),然后去验证,找不到即报错;如果你指定的秘钥不带.pub
后缀或者是其他后缀,那么它会以为你指定的是私钥,然后加上.pub
拓展名获得公钥名字,然后去验证,找不到也会报错。
看过几篇文章,给出的解决方法都是重新创建,并没有说明需要一对秘钥。办法没错,重新创建会同时生成公钥和私钥,也就不存在我这种只上传了公钥的问题了,但我们总要明白为什么不是吗?