目录
简介
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
,以禁用密码登录。