通常情况下,人们喜欢使用密码的方式访问 ssh 服务端,多半是因为设置密钥对比较复杂,以及在其他陌生的客户端的情况下,使用密码有更好的便捷性。
但是当处于固定客户端的情况下,仅仅设置一次密钥对就可以达到一劳永逸的效果。本文将简单记录在常见的操作系统下创建密钥对并连接 Linux 服务器。
SSH 和密钥对
SSH (Secure Shell) 是一种用于安全远程登录和管理网络设备的协议。它通过加密技术确保通信的安全性,常用于在不安全的网络中安全地访问远程服务器。
私钥 (Private Key):
- 存放在本地计算机,必须妥善保管,不能泄露。
- 用于解密通过公钥加密的数据,也可用于生成数字签名。
公钥 (Public Key):
- 可以安全地共享给其他人或服务器。
- 存放在远程服务器中,用于验证连接是否由对应的私钥拥有者发起。
密钥认证过程:
- 生成密钥对:在本地生成公钥和私钥。
- 部署公钥:将公钥上传到远程服务器。
- 登录时验证:SSH 客户端用私钥对数据签名,服务器通过公钥验证签名是否有效。如果匹配,则允许登录。
在生成公钥和私钥时,常用的算法包括 RSA、ECDSA、ED25519 和 DSA,该选择哪种算法呢?
算法 | 密钥长度 | 性能 | 安全性 | 兼容性 | 推荐场景 |
RSA | 2048~4096 | 较快 | 高 | 非常好 | 需要广泛兼容性的场景 |
ECDSA | 256~512 | 快 | 高 | 较好 | 需要高效和地空间占用的场景 |
ED25519 | 256 | 非常快 | 很高 | 较好 | 新型主流系统 |
DSA | 1024 | 慢 | 较低 | 较差 | 干啥啥不行,扔了吧 |
显而易见,最好选择 ED25519 算法。
不同平台创建密钥对通过 SSH 访问 Linux(Debian 为例)
这里主要介绍通过 Windows 以及 MacOS 访问 Debian 服务器的方法。
Windows 10/11
在 Powershell 中执行以下命令生成密钥对,your_key_name
是创建的密钥的名字,用于辨别。
ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\your_key_name
创建后,会提示输入 passphrase,一般情况下直接回车跳过就好。在 Windows 的用户文件夹中的.ssh 目录中,可以找到刚刚创建的密钥对,其中 key 是你自己的私钥,pub 是公钥,需要上传到你要连接的服务器。
然而 Powershell 并没有 ssh-copy-id
这种东西,所以我们使用这种方案:
cat "$env:USERPROFILE\.ssh\your_key_name.pub" | ssh -i "$env:USERPROFILE\.ssh\your_key_name" user@server "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
其中,user@server
是你登陆服务器的用户名和地址,把里面对应的密钥名改成自己的。运行之后会要求输入密码,直接输入密码就好,之后使用如下命令就可以直接登录了。
ssh -i "$env:USERPROFILE\.ssh\your_key_name" user@server
如果你还是嫌麻烦每次都要输入私钥的地址,可以添加到 Powershell 的 fuction 中:
function your_alias_name { ssh -i "$env:USERPROFILE\.ssh\your_key_name" user@server }
之后直接通过 your_alias_name
在 Powershell 中执行就可以登录了。
MacOS Sequoia
理论上 Catalina 之后的版本都可以
在 MacOS 终端 zsh 中运行:
ssh-keygen -t ed25519 -f ~/.ssh/your_key_name
然后通过 ssh-copy-id 将公钥上传到服务器:
ssh-copy-id -i ~/.ssh/your_key_name.pub user@server
输入密码之后就完成了。你可以通过在终端中运行:
ssh -i "~/.ssh/your_key_name" user@server
直接登录。
为了简便操作,可以设置 alias 快速登录(在 MacOS Catalina 之后,终端默认使用 zsh,这里以 zsh 为例)。
vim ~/.zshrc
添加你的别名
alias server_name='ssh -i ~/.ssh/your_key_name user@server'
然后保存并生效
source ~/.zshrc
然后你就可以直接用 alias 别名来快速登录了!