Linux服务器之SSH 密钥创建及密钥登录设置

简介

SSH 默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是更好的解决方案。

密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。

公钥—-添加到服务器的某个账户上,~/.ssh目录下(如该目录不存在,则新建一个),并命名为authorized_keys(如该文件已经存在,则把公钥的内容放在原authorized_keys内容的末尾,如果authorized_keys文件的末尾不是一个换行符,会导致新的公钥添加到前一个公钥的末尾,两个公钥连在一起,使得它们都无法生效。所以,如果authorized_keys文件已经存在,使用ssh-copy-id命令之前,务必保证authorized_keys文件的末尾是换行符(假设该文件已经存在)。

私钥—-必须私密保存,不能泄漏。

SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。

如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。

SSH 密钥登录分为以下的步骤。

预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。

第一步,手动将客户端的公钥放入远程服务器的指定位置。
第二步,客户端向服务器发起 SSH 登录的请求。
第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

操作

在本地计算机上生成密钥对

打开终端或命令提示符窗口(如果你使用Windows,请确保安装了SSH客户端,比如PuTTY或Git Bash)。输入以下命令来生成SSH密钥对:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这个命令中的-t参数指定密钥类型(此处为RSA),-b参数指定密钥的位数(4096位提供更高的安全性),-C参数是注释,用你的邮箱地址或标识替换your_email@example.com

提示你选择密钥对保存的位置和文件名,或者直接按回车键接受默认位置。 如果你已经有密钥对,系统会询问是否覆盖。按需选择。在生成密钥对后,会显示密钥的指纹和随机art字符,这是你的公钥和私钥已经生成。

id_rsa和id_rsa.pub是SSH密钥对中的两个文件,通常由ssh-keygen命令生成。

id_rsa: 这是私钥文件,是你的身份验证凭据之一。私钥应该保密,只有你自己能够访问它。它允许你对已发送给服务器的信息进行签名,并允许你解密服务器用你公钥加密的信息。

id_rsa.pub: 这是公钥文件,对应于你的私钥。公钥可以被分享给他人或用于服务器身份验证。你需要将公钥添加到服务器上的~/.ssh/authorized_keys文件中,这样服务器就可以识别你的私钥发出的请求,并允许你通过身份验证登录。

私钥和公钥是一对密钥,它们之间有数学上的关联。数据使用公钥加密后,只有对应的私钥才能解密。这种关系使得SSH密钥对成为一种安全的身份验证方式。

如果是linux则:

cd /root/.ssh    #进入指定用户的.ssh目录
ssh-keygen -t rsa
[root@springcore .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): #### 要设置密码的话 就在这里输入【可直接为空跳过】
Enter same passphrase again: #### 重复输入密码 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:syK0IidyNKGBvLWCLYBIxP3bqthqeBWr/ehCuGwU8WQ root@springcore
The key's randomart image is:
+---[RSA 3072]----+
|oo.              |
|*o E             |
|*.*..            |
|o=ooo.           |
|++=..oo S        |
|.+oooo . o       |
|Bo++o o .        |
|+O*..+ .         |
|o+.=+..          |
+----[SHA256]-----+

执行后会生成id_rsa和id_rsa.pub两个文件,id_rsa是私钥(重要,不能外泄),id_rsa.pub是公钥。

将公钥上传到服务器

放置公钥(Public Key)到服务器指定用户目录的 .ssh/authorized_key文件中

查看authorized_key文件是否存在,不存在则创建并赋予600权限:

touch authorized_keys
chmod 600 ./authorized_keys

将公钥内容追加到authorized_keys文件中:

cat id_rsa.pub >> authorized_keys

为了确保连接成功,赋予.ssh文件夹700权限:

chmod 700 ~/.ssh    ###修改为指定用户的ssh目录,这里以root用户为例

配置SSH客户端使用密钥登录

修改SSH配置:

vi /etc/ssh/sshd_config

修改以下配置项:

## 开启私钥登录[RSAAuthentication (rsa认证)是只支持第一代SSH通讯协议使用的配置项,在CentOS7.3之后的版本中被废除了,因为默认使用第二代协议了]
RSAAuthentication yes   debian10以后都不需要操作此项.
## 开启 公私钥登录认证
PubkeyAuthentication yes
## root 用户能否通过 SSH 登录
PermitRootLogin yes
## 添加 公钥的保存文件
AuthorizedKeysFile .ssh/authorized_keys

刷新SSH服务:

service sshd restart

使用SSH密钥登录服务器

确保你的私钥位于本地计算机上,通常在~/.ssh/id_rsa(默认位置)

使用私钥登录到服务器:

ssh your_username@your_server_ip -i /path/to/private/key

在这个命令中,-i参数指定了私钥文件的路径。

关闭密码登录

测试密钥登陆成功后关闭密码登录:

修改SSH配置:

vi /etc/ssh/sshd_config

修改以下配置项

PasswordAuthentication no

刷新SSH服务

service sshd restart

注意事项

  • 确保服务器的~/.ssh/authorized_keys文件的权限为600(仅对所有者可写和可读)。
  • 保护好私钥文件,不要泄露给其他人。
  • 如果使用密码登录和SSH密钥登录都被启用,确保SSH配置文件(/etc/ssh/sshd_config)中PasswordAuthentication设置为no,以禁用密码登录。