今天来唠唠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拓展名获得公钥名字,然后去验证,找不到也会报错。

看过几篇文章,给出的解决方法都是重新创建,并没有说明需要一对秘钥。办法没错,重新创建会同时生成公钥和私钥,也就不存在我这种只上传了公钥的问题了,但我们总要明白为什么不是吗?

最后修改:2020 年 12 月 24 日 05 : 06 PM