相比密码验证,密钥验证具有以下优势:
- 更高的安全性:私钥存储在客户端,不会在网络上传输,减少了密码被盗用的风险。
- 免去密码记忆的烦恼:用户无需记忆复杂的密码,只需保存好私钥即可。
二、具体操作
那么铺垫了这么多,到底如何才能使用密钥进行验证登录呢? 不要着急,总共就三板斧:
- 1.生成密钥对(包括公钥和私钥)
- 2.在服务器端进行配置,允许密钥认证方式并且配置好相关的授权列表。
- 3.确保服务器的公钥和客户端使用的私钥是匹配的,使用SSH命令进行登录即可大功告成!
1.生成密钥对
1.1抉择:客户端生成?OR服务器生成?
生成密钥对的时候,可以在客户端进行生成,也可以在服务器上进行生成,这个具体取决于哪种方式对你更加方便。
- 如果你有一台个人PC,但是你有多个linux服务器,你希望生成一个密钥对之后,就可以访问所有的服务器,那么你就在个人PC上进行密钥对的生成即可。
- 如果你有一台linux服务器,但是需要多个客户终端去连这个服务器,那么你就在这台linux服务器上生成密钥对即可。
- 如果不属于以上两种,那你就随意选一种就可以。
1.2执行生成密钥对:
在命令窗口执行以下命令即可:
ssh-keygen
执行完以上代码之后,会出现提示,没有特殊要求的话,直接一路回车,然后就生成结束了。
如果有特殊要求的话,就请仔细查阅1.3再啰嗦一下
这个部分。
1.3再啰嗦一下:
SSH(Secure Shell)是一种网络协议,用于通过加密的通信管道在网络上安全地进行远程登录和执行命令。SSH协议通过加密技术,防止了数据在传输过程中被窃取或篡改的风险。
ssh-keygen
命令是SSH工具包中的一个命令行工具,用于生成SSH密钥对,即公钥和私钥。SSH密钥对由一对相互关联的密钥组成:
- 公钥(public key):公钥用于加密数据或验证签名,并且可以安全地与其他人分享,例如将其存储在远程服务器上以进行身份验证。
- 私钥(private key):私钥通常保存在生成密钥对的计算机上,并且必须严格保密。私钥用于解密数据或生成数字签名,用于身份验证。
ssh-keygen
命令有多个可选选项,其中一些常用选项包括:
-t
:指定要生成的密钥类型,如rsa
、dsa
、ecdsa
、ed25519
等。-b
:指定生成密钥的位数,通常用于RSA密钥,如-b 2048
。-C
:在生成密钥时添加注释,可用于识别密钥的用途或所有者。-f
:指定生成密钥的文件路径和名称。-N
:设置用于保护私钥的密码,可以为空。-q
:静默模式,减少输出信息。-y
:从私钥中提取公钥并打印到标准输出。-h
:显示命令的使用帮助信息。
这些选项可以根据需要组合使用,以生成符合特定需求的密钥对。
当你使用 ssh-keygen
命令时,它会向你提供一些选项,例如密钥类型(RSA、DSA、ECDSA、ED25519等)、密钥位数、密钥保存路径等。一般来说,你可以按照默认选项生成密钥对,但也可以根据需要自定义选项。
生成密钥对后,你可以将公钥部署到需要进行SSH连接的服务器上,以便你可以使用对应的私钥进行安全的远程登录或执行命令,而无需输入密码。这种基于密钥对的身份验证方式通常比基于密码的身份验证更安全。
1.4生成的密钥对长啥样:
生成的密钥对如果你没有特意的选择路径的话,一般都在默认路径下。
- windows电脑对应的路径为:
C:\Users\你的用户名\.ssh
- MAC/linux对应的路径为:
~/.ssh
生成的密钥对有两个文件:id_rsa(私钥文件)和 id_rsa.pub(公钥文件)
至此,第一步已经成功完成了,恭喜你!接着来看第二步吧。
2.在服务器端进行配置
此时需要做两件事情:
- 1.确保公钥内容在
~/.ssh/authorized_key
文件(如果没有这个文件,请手动创建)中。(无论是在客户端生成的密钥对还是服务端生成的密钥对) - 2.确保服务器端打开了允许通过秘钥验证的方式登录。
2.1服务端的authorized_key
(授权列表)文件配置
2.1.1 本地PC生成密钥对的小伙伴,请看这部分:
将本地生成的公钥上传到服务器中可以通过多种方式实现,以下是其中两种常用的方法:
方法一:使用 SSH 拷贝公钥到远程服务器(适用于Mac、Linux电脑)
- 使用以下命令将本地公钥复制到远程服务器:
ssh-copy-id username@remote_host
其中 username
是你在远程服务器上的用户名,remote_host
是远程服务器的地址或主机名。系统会要求你输入密码,然后将公钥自动添加到远程服务器的 ~/.ssh/authorized_keys
文件中。
2. 如果你的服务器端口不是默认的 22 端口,可以使用 -p
参数指定端口号:
ssh-copy-id -p port_number username@remote_host
其中 port_number
是你的服务器 SSH 服务的端口号。
方法二:手动上传公钥到服务器(适用于Windows、Mac及linux电脑)
- 首先使用
scp
命令将本地公钥复制到远程服务器,例如:
scp ~/.ssh/id_rsa.pub username@remote_host:~/temp_key.pub
这将把本地公钥文件 id_rsa.pub
复制到远程服务器的 ~/temp_key.pub
文件中。
2. 登录到远程服务器,并将公钥内容追加到 ~/.ssh/authorized_keys
文件中:
ssh username@remote_host
cat ~/temp_key.pub >> ~/.ssh/authorized_keys
rm ~/temp_key.pub # 可选:删除临时公钥文件
这样就将本地生成的公钥内容手动添加到了远程服务器的授权列表中。
2.1.2 服务器生成密钥对的小伙伴,请看这部分:
1.首先,在服务器的授权列表,将生成的公钥内容放进去。具体步骤如下:
- 先忍耐一下,通过以往密码的方式登录到你的服务器。
- 将服务端生成的公钥内容添加到
~/.ssh/authorized_keys
文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 修改
authorized_keys
文件的权限:(如果权限够,这步可以省略)
chmod 600 ~/.ssh/authorized_keys
2.其次,将服务器生成的私钥文件复制到你的本地电脑,用于之后的密钥验证登录。
你可以使用以下方法将服务器上的私钥文件复制到本地:
Windows:
- 使用SCP命令进行复制: 使用SCP命令连接到服务器并将私钥文件下载到本地计算机上的当前目录中。
scp命令复制的代码如下:
scp username@server_address:~/.ssh/id_rsa .
将 username
替换为你在服务器上的用户名,server_address
替换为你的服务器地址,~/.ssh/id_rsa
为默认的私钥文件存放的地址,如果你的路径不一样,请进行替换。.
为本地计算机上要保存私钥文件的路径,这里为当前目录。
2. 使用 SSH 客户端: 如果你使用的 SSH 客户端支持文件传输功能,你也可以使用它来将文件从服务器复制到本地计算机。
macOS:
- 使用 SCP 命令: 在终端中使用 SCP 命令从服务器复制文件到本地计算机。例如:
scp username@server_address:/path/to/private_key /local/path/to/save
将 username
替换为你在服务器上的用户名,server_address
替换为你的服务器地址,/path/to/private_key
替换为服务器上私钥文件的路径,/local/path/to/save
替换为本地计算机上要保存私钥文件的路径。
2. 使用 SFTP: 如果你使用的 SSH 客户端支持 SFTP 功能,你可以连接到服务器并使用 SFTP 功能将文件下载到本地计算机上。
2.2 服务端允许通过密钥方式登录的配置确认
确认服务器端已经开启了允许密钥登录方式的配置可以通过以下步骤:
- 登录到服务器:首先,通过用户名和密码登录到服务器。
- 检查SSH配置文件:使用文本编辑器(如nano或vim)打开SSH配置文件。在大多数Linux系统中,SSH配置文件位于
/etc/ssh/sshd_config
。 - 查找密钥登录配置:在配置文件中查找以下行:
PubkeyAuthentication yes
如果这一行存在,并且值为 yes
,则表示已经允许使用密钥登录。如果值为no
,需要手动改为yes
*注意:
PasswordAuthentication yes
这个配置项是控制是否允许使用密码登录的,值是yes
代表允许密码登录,如果改为no
,则无法再通过密码的方式进行登录。
切记:用密钥登录的方式没有调通之前,千万不要关闭密码登录,否则你将会把自己困住,再也进不去服务器( ̄︶ ̄),别问我怎么知道的……
- 重启SSH服务:如果你对配置文件进行了更改,则必须重启SSH服务才可以使更改生效。可以使用以下命令来重启SSH服务:
sudo systemctl restart sshd
至此,第二步的工作也搞定了,成功就在眼前了,让我们一鼓作气完成!
3.使用SSH命令指定私钥登录服务器
3.1 用SSH指定私钥的方式登录到服务器
现在,我们本地已经有私钥文件了,直接验证一波使用密钥验证登录到服务器,看是否可以:
ssh -i /path/to/private_key username@server_ip
这个命令是用于通过SSH连接到远程服务器的命令,下面解释一下其中的各个部分:
- ssh:这是命令本身,表示要使用SSH协议进行连接。
- -i /path/to/private_key:这是SSH选项
-i
,用于指定私钥文件的路径。私钥文件是用于密钥身份验证的一部分,它与公钥文件成对生成,通常存储在本地计算机上。在这个命令中,/path/to/private_key
应该被替换为你实际私钥文件的路径。这个私钥文件必须匹配在服务器上为相应用户配置的公钥。 - username@server_ip:这是你要连接的远程服务器的用户名和IP地址或域名。
username
是你在远程服务器上的用户名,server_ip
是服务器的IP地址或域名。通过这个部分,SSH知道要连接哪个远程服务器,并且使用提供的用户名进行登录。
所以,整个命令的含义是:使用指定的私钥文件连接到远程服务器,以提供的用户名进行登录。这个命令适用于基于密钥的身份验证,私钥文件是用于验证你的身份,并且必须与服务器上对应用户的公钥匹配。
我运行的截图如下:
可以看到,我们已经大功告成了!已经可以成功通过密钥验证的方式链接服务器了!
什么,命令太长了,记不住?那你试试下面这种方式:
3.2 用SSH默认私钥的方式登录到服务器
ssh username@server_ip
这种情况就是不加 -i
参数,SSH 将默认使用用户的默认私钥文件进行连接。
通常情况下,这个默认私钥文件位于用户的家目录下的 .ssh
文件夹中,文件名为 id_rsa
。
所以,如果你满足这个条件的话,你会发现,这样也可以直接登录服务器了!
啥,我是个骗子,这种方式不够优雅?
好好好,压箱底的东西看来非得掏出来了,给我往下看!
3.3 用更优雅的命令方式进行SSH登录到服务器
秘籍就是.ssh目录下的config
文件,这就是想优雅的比较关键的一点。
.ssh
目录下的 config
文件是 SSH 客户端的配置文件,它可以包含一系列主机配置选项,以及对每个主机的自定义配置。这个文件允许你在连接到远程主机时自定义一些参数,从而简化 SSH 连接过程并提高灵活性。
以下是一些常见的用法:
- 指定主机别名:你可以为远程主机设置别名,这样你就不必每次都输入完整的主机名。例如:
Host myserver
HostName server_ip
User username
这样,你只需要使用 ssh myserver
就可以连接到 server_ip
,并以 username
用户身份登录。
2. 指定身份验证方法:你可以在 config
文件中指定要使用的身份验证方法,如使用特定的私钥文件或密码。例如:
Host myserver
HostName server_ip
User username
IdentityFile /path/to/private_key
这样,你就可以在连接到 myserver
时自动使用指定的私钥文件进行身份验证。
3. 端口转发和代理:你可以配置端口转发和代理,以便在 SSH 连接时自动设置端口转发或使用代理。例如:
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**





**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
583079)]
[外链图片转存中...(img-hJgexMkT-1715566583080)]
[外链图片转存中...(img-7tcs72Qg-1715566583080)]
[外链图片转存中...(img-AH1qfoLl-1715566583080)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**