密钥是什么
密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。
SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。
密钥登录的过程
SSH 密钥登录分为以下的步骤。
预备步骤,客户端通过ssh-keygen
生成自己的公钥和私钥。
第一步,手动将客户端的公钥放入远程服务器的指定位置。
第二步,客户端向服务器发起 SSH 登录的请求。
第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
ssh-keygen命令
OpenSSH 提供了一个工具程序ssh-keygen
命令,用来生成密钥。
# 直接输入ssh-keygen,程序会询问一系列问题,然后生成密钥。
ssh-keygen
# 使用-t参数,指定密钥的加密算法。一般为dsa或rsa
ssh-keygen -t dsa
# -b参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。
ssh-keygen -b 2048
# -f参数指定生成的私钥文件
ssh-keygen -f mykey
# -F参数检查某个主机名是否在known_hosts文件里面。
ssh-keygen -F example.com
# -N参数用于指定私钥的密码(passphrase)。
ssh-keygen -t dsa -N secretword
# -p参数用于重新指定私钥的密码(passphrase)。它与-N的不同之处在于,新密码不在命令中指定,而是执行后再输入。ssh 先要求输入旧密码,然后要求输入两遍新密码。
# -R参数将指定的主机公钥指纹移出known_hosts文件。
ssh-keygen -R example.com
执行ssh-keygen命令以后,会出现第一个问题,询问密钥保存的文件名,默认是~/.ssh/id_dsa文件,这个是私钥的文件名,对应的公钥文件~/.ssh/id_dsa.pub是自动生成的。用户的密钥一般都放在主目录的.ssh目录里面。
ssh开启免密登录
编辑 sshd_config 配置文件
vim /etc/ssh/sshd_config
# 开启 RSA 密钥验证,公钥验证功能
PubkeyAuthentication yes
# 设置公钥验证文件的路径
AuthorizedKeysFile .ssh/authorized_keys
# 关闭密码认证
PasswordAuthentication no
生成公钥和私钥
方法一:在服务器上生成密钥
生成公钥和私钥,把公钥上传到.ssh 目录authorized_keys文件中。
ssh-keygen
cat .ssh/id_rsa.pub > .ssh/authorized_keys
下载.ssh/id_rsa文件,打开xshell,点击工具--用户密钥管理者--导入,将id_rsa文件导入,xshell用户密钥
配置xshell使用刚导入的密钥即可进行免密登录。
方法二:在xshell上生成密钥
点击 Xshell 的工具-新建用户密钥生成向导,开始生成密钥。
弹出页面的密钥类型和密钥长度默认不要修改,点击下一步,看到程序生成 2048 位 RSA 密钥,点击下一步,输入密钥名称和登录密码。密钥名称随便起一个,密码是用来和密钥一起双重加密的,哪怕密钥被盗了,没有密码还是无法 SSH 登陆到服务器上。
点击下一步,把密钥另存为文件保存到本地电脑。这个是公钥。
另外在 Xshell 的工具>>用户密钥管理者里面能够看到对应的私钥,私钥最好另存到本地电脑和邮箱中,这点很重要。
上传公钥到服务器.ssh目录authorized_keys。
设置权限
chmod 700 .ssh
chmod 644 .ssh/authorized_keys
配置xshell使用刚导入的密钥即可进行免密登录。
在服务器上使用免密登录
# -i 指定私钥文件登录
ssh -i ecs-key.pem 192.168.1.15
评论区