(2024最新)手把手教你生成SSH Key并配置远程连接 – wiki基地


(2024最新)手把手教你生成SSH Key并配置远程连接:从入门到精通的终极指南

引言:告别密码,拥抱更安全、更高效的未来

在数字化浪潮席卷全球的今天,无论是开发者、系统管理员,还是任何需要与远程服务器打交道的IT从业者,远程连接都是一项不可或-缺的基本技能。传统的基于“用户名+密码”的登录方式,虽然直观,但其安全性短板日益凸显:密码可能被暴力破解、在不安全的网络中被窃听、因多平台使用相同密码而导致“一处失守,处处皆破”的窘境。

为了解决这些问题,一种更为强大、安全且高效的认证机制——SSH Key(安全外壳协议密钥)应运而生。它基于非对称加密技术,为你和你的服务器之间建立起一道坚不可摧的信任桥梁。一旦配置完成,你不仅能享受到无需重复输入密码的便捷,更能将服务器的安全等级提升到一个全新的高度。

本文将作为一份面向2024年的、最详尽的“手把手”教程,从SSH Key的基本原理讲起,一步步引导你完成SSH Key的生成、在不同操作系统(Windows, macOS, Linux)上的操作、公钥的部署、客户端的精细化配置,乃至服务器端的安全加固。无论你是初次接触SSH的新手,还是希望系统性梳理知识的老手,本指南都将为你提供清晰、实用且全面的操作指引,助你彻底掌握这项现代IT基础设施的基石技术。


第一章:理论基础篇 —— 为什么SSH Key是更优选择?

在深入实践之前,我们有必要花一点时间理解SSH Key背后的工作原理。这种理解将帮助你更好地排查问题,并对其安全性建立信心。

1.1 密码认证的“原罪”

  • 易于猜测与破解:弱密码(如123456, password)在自动化扫描工具面前不堪一击。即使是强密码,如果被泄露在其他平台的数据库中,也可能被用于“撞库”攻击。
  • 传输风险:虽然SSH协议本身会加密整个通信通道,但密码的反复输入增加了其在本地计算机被恶意软件(如键盘记录器)捕获的风险。
  • 管理复杂性:为了安全,你需要为不同的服务器设置不同的复杂密码,并定期更换。这对于管理大量服务器的管理员来说,是一场记忆力的噩梦。
  • 自动化障碍:在编写自动化脚本(例如持续集成/持续部署CI/CD、备份脚本)时,将明文密码硬编码在脚本中是极度危险的做法。

1.2 SSH Key的非对称加密魔法

SSH Key认证的核心是非对称加密。当你生成一对SSH Key时,实际上是创建了两个关联的文件:

  1. 私钥 (Private Key):通常命名为 id_rsa, id_ed25519 等。这是你的个人身份凭证,必须、绝对、永远不能泄露给任何人。它存储在你自己的电脑上,受到严密保护。它就像是你家保险箱的唯一一把钥匙。
  2. 公钥 (Public Key):通常命名为 id_rsa.pub, id_ed25519.pub 等。这是可以公开分享的“锁”。你可以把它放在任何你希望访问的远程服务器上。

认证流程简述如下:

  1. 部署:你将你的公钥内容,放置在远程服务器A的特定文件(~/.ssh/authorized_keys)中。这相当于在服务器A的门上安装了一把你的专属“锁”。
  2. 连接请求:当你的本地计算机(客户端)向服务器A发起SSH连接请求时,会告诉服务器:“嘿,我是持有某个私钥的人,我想登录。”
  3. 挑战:服务器A看到你的请求后,会在authorized_keys文件中查找匹配的公钥。找到后,服务器会用这个公钥加密一个随机生成的“挑战”字符串,然后发送给你的客户端。
  4. 响应:你的客户端收到这个加密的“挑战”后,会尝试用你本地存储的私钥来解密。因为公钥和私钥是唯一配对的,所以只有你(真正的私钥持有者)才能成功解密。
  5. 验证成功:客户端将解密后的原始“挑战”字符串发回给服务器A。服务器A一对比,发现与自己最初生成的字符串完全一致,便确认了你的身份,从而允许你登录。整个过程无需传输任何密码。

1.3 使用SSH Key的压倒性优势

  • 极致安全:SSH密钥通常非常长(例如RSA 4096位或Ed25519),暴力破解在当前计算能力下几乎是不可能的。
  • 无缝便捷:一次配置,永久有效。登录远程服务器、执行Git操作等,都只需一条命令,无需打断思路输入密码。
  • 自动化利器:是实现自动化运维、CI/CD流水线、Ansible/SaltStack等配置管理工具安全通信的基石。
  • 身份清晰:一个公钥代表一个客户端身份,便于服务器端进行精细的权限管理和审计。

第二章:实践操作篇(一) —— 在你的电脑上生成SSH Key

现在,让我们卷起袖子,开始动手生成属于我们自己的SSH Key。ssh-keygen命令是我们的核心工具,它在macOS, Linux以及现代Windows系统中都是内置的。

2.1 准备工作:打开你的终端

  • macOS: 打开“应用程序” -> “实用工具” -> “终端 (Terminal)”。
  • Linux (Ubuntu, CentOS等): 按 Ctrl+Alt+T 快捷键,或在应用菜单中找到“终端”。
  • Windows 10/11: 强烈推荐使用 Windows Terminal。你可以在Microsoft Store中免费安装。打开后,选择PowerShell或CMD标签页均可。Windows系统自带有OpenSSH客户端,因此ssh-keygen命令可以直接使用。

2.2 执行 ssh-keygen 命令

在打开的终端中,输入以下命令并按回车。这是2024年最推荐的命令,因为它使用了目前被认为兼具高安全性和高性能的Ed25519算法。

bash
ssh-keygen -t ed25519 -C "[email protected]"

让我们详细解析这个命令的每个部分:

  • ssh-keygen: 这就是生成密钥的主命令。
  • -t ed25519: -t 参数(type)用于指定加密算法。
    • ed25519: 当前的首选推荐。它比传统的RSA算法速度更快,安全性更高,且生成的密钥更短,更易于管理。
    • rsa: 曾经的默认选项。如果你需要兼容非常古老的系统,可能会用到它。如果要使用RSA,请务必指定足够长的位数,例如:-b 4096
  • -C "[email protected]": -C 参数(comment)用于添加一段注释。这不会影响密钥的功能,但它会出现在公钥文件的末尾,方便你或其他人识别这个密钥的来源。通常,我们使用自己的邮箱地址作为注释。

2.3 交互式设置

执行命令后,程序会与你进行三次交互:

1. 指定密钥保存位置:

“`

Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/your_username/.ssh/id_ed25519):
“`

这里询问你希望将密钥文件保存在哪里。括号中的是默认路径(~/.ssh/id_ed25519),~代表你的用户主目录。对于绝大多数情况,直接按回车使用默认路径即可。 除非你需要为不同目的(如公司、个人项目、GitHub)管理多对密钥,才需要指定不同的文件名。

2. 设置密码短语 (Passphrase):

“`

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
“`

这是极其重要的一步!Passphrase是为你的私钥文件额外设置的一层密码保护。

  • 设置Passphrase的优点:万一你的电脑被盗或被黑客入侵,即使他们偷走了你的私钥文件(id_ed25519),如果没有这个Passphrase,他们也无法使用它。这给了你宝贵的时间去服务器上移除对应的公钥,防止损失。强烈建议设置一个健壮的Passphrase!
  • 不设置Passphrase的优点:连接时无需再次输入,对于频繁操作和完全自动化的脚本来说更方便。
  • 权衡与建议:为了安全,请务必设置。如果你觉得每次输入麻烦,后续可以配合ssh-agent来管理,实现“只在开机后输入一次”的效果。

输入你设定的密码短语,回车,再输入一次进行确认。如果不想设置,直接两次回车即可。

3. 生成成功!

如果一切顺利,你会看到类似下面的输出:

“`

Your identification has been saved in /Users/your_username/.ssh/id_ed25519
Your public key has been saved in /Users/your_username/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [email protected]
The key’s randomart image is:
+–[ED25519 256]–+
| . .. . |
| . o . . |
| . . = o . |
| . . = * . |
| . S = = o . |
| . . o B o . .|
| . o * B . . |
| o..= * o |
| .E= o . |
+—-[SHA256]—–+
“`

恭喜!你已经在本地计算机的 ~/.ssh/ 目录下成功创建了一对SSH Key:

  • id_ed25519: 你的私钥
  • id_ed25519.pub: 你的公钥

再次强调:id_ed25519 文件是你的最高机密,绝不可外传!而 id_ed25519.pub 文件里的内容,就是我们接下来要部署到远程服务器上的。


第三章:实践操作篇(二) —— 将公钥部署到远程服务器

现在我们有了“钥匙”,是时候去服务器上安装“锁”了。这里介绍两种最常用的方法。

方法一:ssh-copy-id 命令(推荐,最简单)

ssh-copy-id 是一个专门为此设计的便捷脚本,它能自动完成所有配置工作,包括创建目录、追加公钥、设置正确的权限。macOS和Linux系统通常都自带此命令。Windows用户可以通过Git Bash或WSL(Windows Subsystem for Linux)来使用它。

操作步骤:

  1. 打开终端,执行以下命令,将user替换为你的远程服务器用户名,remote_host替换为服务器的IP地址或域名。

    bash
    ssh-copy-id user@remote_host

    如果你生成密钥时使用了非默认的路径或算法,可以使用 -i 参数指定公钥文件:

    bash
    ssh-copy-id -i ~/.ssh/my_other_key.pub user@remote_host

  2. 系统会提示你输入userremote_host上的密码。这是你最后一次需要通过密码登录这台服务器。

    “`

    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
    user@remote_host’s password:
    “`

  3. 输入密码并回车。如果成功,你会看到类似信息:

    “`

    Number of key(s) added: 1

    Now try logging into the machine, with: “ssh ‘user@remote_host'”
    and check to make sure that only the key(s) you wanted were added.
    “`

大功告成! ssh-copy-id 已经帮你把公钥内容安全地追加到了服务器的 ~/.ssh/authorized_keys 文件中,并设置了正确的文件夹和文件权限。

方法二:手动复制粘贴(通用,理解原理)

如果你的客户端环境没有ssh-copy-id命令,或者你想更深入地理解其工作流程,可以采用手动方式。

操作步骤:

1. 在本地计算机上,复制公钥内容。

打开终端,使用cat命令显示公钥文件的内容,然后将其完整复制到剪贴板。

bash
cat ~/.ssh/id_ed25519.pub

你会看到一行以 ssh-ed25519 开头,以你的邮箱结尾的长字符串。从头到尾,一个字符都不能少地复制下来。

2. 使用密码登录到你的远程服务器。

bash
ssh user@remote_host

输入你的密码登录。

3. 在远程服务器上,将公钥写入authorized_keys文件。

登录后,执行以下一系列命令:

“`bash

首先,确保~/.ssh目录存在,如果不存在则创建

mkdir -p ~/.ssh

将你刚才复制的公钥内容追加到authorized_keys文件中

注意:使用 >> (追加),而不是 > (覆盖),以防覆盖掉已有的其他密钥

echo “在此处粘贴你复制的公钥内容” >> ~/.ssh/authorized_keys

关键一步:设置正确的权限!SSH服务对权限要求极为严格,权限错误会导致密钥认证失败。

~/.ssh 目录权限必须为 700 (只有所有者能读、写、执行)

chmod 700 ~/.ssh

authorized_keys 文件权限必须为 600 (只有所有者能读、写)

chmod 600 ~/.ssh/authorized_keys
“`

4. 退出服务器,测试连接。

执行exit命令退出远程服务器。

验证连接

无论你使用哪种方法部署了公钥,现在都是见证奇迹的时刻。在你的本地终端中,再次尝试连接服务器:

bash
ssh user@remote_host

  • 如果你没有为SSH Key设置Passphrase,你将直接登录成功,不再有任何密码提示!
  • 如果你设置了Passphrase,系统会提示你输入它:
    > Enter passphrase for key '/Users/your_username/.ssh/id_ed25519':
    输入正确的Passphrase后,即可登录。

至此,你已成功配置了基于SSH Key的免密(或免服务器密码)登录。


第四章:进阶技巧与安全加固

掌握了基础配置后,让我们探索一些能极大提升效率和安全性的高级玩法。

4.1 使用SSH配置文件(~/.ssh/config)简化连接

每次都输入ssh my_username@a_very_long_server_name.com -p 2222这样的长命令是不是很繁琐?~/.ssh/config文件是你的救星。你可以在这个文件中为每个服务器创建别名和预设配置。

  1. 本地计算机上,创建或编辑该文件:
    bash
    nano ~/.ssh/config

  2. 在文件中添加配置块,格式如下:

    “`ini

    我的开发服务器

    Host dev-server
    HostName 198.51.100.10
    User dev_user
    Port 22
    IdentityFile ~/.ssh/id_ed25519

    我的GitHub个人项目服务器

    Host project-gamma
    HostName gamma.myprojects.net
    User deployer
    Port 22022
    IdentityFile ~/.ssh/id_ed25519_project_gamma

    GitHub的配置

    Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    “`

配置项解析:

  • Host: 别名,你之后连接时使用的短名称。
  • HostName: 真实的服务器IP地址或域名。
  • User: 登录用户名。
  • Port: SSH端口号(如果不是默认的22)。
  • IdentityFile: 指定使用哪个私钥文件进行连接。这对于管理多对密钥至关重要。

保存文件后,见证魔法:

  • 要连接开发服务器,只需输入:ssh dev-server
  • 要连接项目服务器,只需输入:ssh project-gamma

SSH客户端会自动读取config文件,找到对应的Host块,并使用其中定义的所有参数发起连接。这极大地简化了日常操作。

4.2 在服务器端禁用密码登录,实现终极安全

一旦你确认SSH Key可以正常工作,并且你(以及所有合法用户)都已配置好密钥登录,就应该在服务器上彻底禁用密码认证。这会关闭所有通过暴力破解密码进入服务器的大门。

  1. 以root或有sudo权限的用户登录到你的远程服务器
  2. 编辑SSH服务的配置文件 /etc/ssh/sshd_config
    bash
    sudo nano /etc/ssh/sshd_config
  3. 在文件中找到以下几行,修改它们的值(如果行首有#,请去掉#来取消注释):

    “`ini

    禁用密码认证

    PasswordAuthentication no

    确保公钥认证是开启的

    PubkeyAuthentication yes

    (可选但推荐)禁止root用户直接通过SSH登录

    PermitRootLogin no
    “`
    警告:在执行此操作前,请务必再三确认你的SSH Key可以无误地登录!否则,一旦禁用密码登录且Key有问题,你将把自己锁在服务器外面。

  4. 保存文件,然后重启SSH服务以使配置生效。

    • 对于使用Systemd的系统 (Ubuntu, Debian, CentOS 7+, etc.):
      bash
      sudo systemctl restart sshd
    • 对于较老的系统:
      bash
      sudo service ssh restart

现在,任何尝试使用密码登录到你服务器的请求都将被直接拒绝,你的服务器安全得到了质的飞跃。


总结:你的新起点

恭喜你!通过这篇详尽的指南,你不仅学会了如何生成和使用SSH Key,更理解了其背后的安全原理,并掌握了足以应对复杂场景的高级配置技巧。

回顾一下我们走过的路:
1. 理解了原理:明白了SSH Key非对称加密的优势,以及为何它远胜于传统密码。
2. 生成了密钥:使用ssh-keygen命令,特别是推荐的ed25519算法,创建了属于你自己的密钥对。
3. 部署了公钥:通过ssh-copy-id或手动方式,将公钥安全地安装到了远程服务器上。
4. 实现了便捷登录:体验了无需密码即可访问服务器的流畅。
5. 掌握了进阶配置:学会了使用~/.ssh/config文件简化连接,并通过禁用服务器密码登录来终极加固安全。

从今天起,请将使用SSH Key作为你操作所有远程服务器和服务的标准习惯。这不仅仅是一项技术操作,更是一种专业的、注重安全的思维方式。它将为你未来的开发、运维和系统管理工作,打下坚实而可靠的基础。现在,去享受那个没有繁琐密码的、更安全、更高效的数字世界吧!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部