SSH Key是什么?看这篇就够了 – wiki大全

很抱歉,我刚才尝试写入文件时遇到了一个环境问题。不过,这不影响我为您提供所需的内容。

这是您要求的关于SSH Key的详细文章。


SSH Key是什么?看这篇就够了

在当今的软件开发和服务器管理中,我们无时无刻不在与远程服务器打交道。无论是通过 ssh 命令登录服务器,还是使用 git 推送代码到 GitHub,一个安全、高效的身份验证方式至关重要。传统的密码登录方式不仅繁琐,还面临着被暴力破解的风险。而SSH Key,作为一种更现代、更安全的解决方案,已经成为业界标准。

本文将带你深入了解SSH Key的方方面面,从核心概念到工作原理,再到手把手的实战教程。无论你是初学者还是希望巩固知识的开发者,这篇文章都将是你理想的指南。


1. SSH Key 究竟是什么?

要理解SSH Key,我们首先要明白什么是 SSH

SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境。我们最常用的就是通过它来远程登录和管理服务器。

传统的SSH登录方式是使用用户名和密码。每次连接时,你都需要手动输入密码来进行身份验证。这种方式有两个主要问题:
1. 安全风险:如果密码不够复杂,很容易被自动化脚本进行暴力破解(不断尝试密码)。
2. 便利性差:每次登录都要输入密码,对于需要频繁操作或自动化脚本(如CI/CD)的场景来说,非常低效。

为了解决这些问题,SSH Key(SSH密钥对)应运而生。

SSH Key是一种基于非对称加密的身份验证机制。它会生成一对密钥:一个私钥 (Private Key) 和一个公钥 (Public Key)

  • 私钥 (id_rsaid_ed25519)

    • 这是你的个人身份凭证,绝对不能泄露给任何人
    • 它存储在你自己的电脑上,受到严格的保护。
    • 可以把它想象成你家的物理钥匙,只有你持有,用来打开锁。
  • 公钥 (id_rsa.pubid_ed25519.pub)

    • 这是可以公开分享的部分,可以放心地交给任何人
    • 你需要把它预先放置在你想要访问的远程服务器上。
    • 可以把它想象成安装在你家门上的锁,任何人都可以看到它,但只有持有正确钥匙的人才能打开。

核心思想:公钥和私钥在数学上是相互关联的。用公钥加密的数据,只有对应的私钥才能解密;反之,用私钥“签名”的数据,只有对应的公key才能验证。这使得服务器可以通过你是否持有正确的私钥来确认你的身份,而无需知道你的私钥具体是什么。


2. SSH Key 的工作原理

了解了基本概念后,让我们看看当你使用SSH Key登录服务器时,背后到底发生了什么。

准备阶段

  1. 生成密钥对:在你的本地电脑(客户端)上生成一个私钥和一个公钥。
  2. 部署公钥:将你的公钥复制到你想要访问的远程服务器上,并添加到特定文件(通常是 ~/.ssh/authorized_keys)中。

连接与验证过程

当你尝试连接服务器时(例如执行 ssh user@hostname):

  1. 发起请求:你的客户端向服务器发起一个登录请求,并告知服务器它希望使用哪个公钥进行身份验证。
  2. 服务器响应:服务器在 authorized_keys 文件中查找你指定的公钥。
  3. 发送质询 (Challenge):如果找到了公钥,服务器会生成一个随机的、临时的字符串,并使用你的公钥对这个字符串进行加密。然后,将这个加密后的“质询”发送回你的客户端。
  4. 客户端解密:你的客户端收到加密的质询后,会尝试使用本地存储的私钥来解密它。
    • 如果成功:这证明了你的客户端确实持有与服务器上存储的公钥相匹配的私钥。客户端将解密后的原始字符串发送回服务器。
    • 如果失败:说明你没有正确的私钥,连接将失败。
  5. 完成验证:服务器收到客户端返回的解密后字符串,并与自己最初生成的原始随机字符串进行比对。如果完全一致,服务器就确认了你的身份,允许你登录,整个过程无需输入密码。

整个过程的关键在于,私钥从未在网络上传输过,极大地提高了安全性。即使有人截获了你们之间的通信,他也只能得到被公钥加密的数据,没有对应的私钥是无法解密的。


3. 为什么要使用 SSH Key?

相比传统的密码登录,使用SSH Key有以下显著优势:

  • 极高的安全性

    • SSH密钥通常非常长(例如2048位或4096位),由复杂的算法生成。想通过暴力破解来猜出私钥,在现有计算能力下几乎是不可能的。
    • 它从根本上杜绝了因弱密码、密码复用或密码泄露带来的风险。
  • 无与伦比的便利性

    • “免密登录”:一次配置,永久方便。你无需再记忆和输入各种复杂的服务器密码。
    • 自动化任务的基石:对于持续集成/持续部署(CI/CD)、Git操作、备份脚本等自动化流程至关重要。这些工具可以非交互式地安全连接到服务器,无需人工干预。
  • 更简单的权限管理

    • 要授予某人访问权限,只需将其公钥添加到服务器的 authorized_keys 文件即可。
    • 要撤销某人的访问权限,只需从文件中删除其公钥,访问权限立即失效,比修改共享密码要方便和安全得多。

4. 实战:如何生成和使用 SSH Key

下面,我们通过一个完整的步骤,教你如何在本地生成SSH Key并用它登录远程服务器。

步骤一:在本地生成 SSH 密钥对

打开你的终端(在Windows上可以是 Git Bash、WSL 或 PowerShell)。执行以下命令:

“`bash

推荐使用 Ed25519 算法,它更现代、更安全、性能也更好

ssh-keygen -t ed25519 -C “[email protected]

如果需要兼容旧系统,也可以使用 RSA 算法

ssh-keygen -t rsa -b 4096 -C “[email protected]

“`

  • -t:指定密钥的加密算法(ed25519rsa)。
  • -b:指定密钥的长度(仅对RSA有效),4096位足够安全。
  • -C:一个注释,通常用于标识这个密钥是谁的,使用你的邮箱是一个好习惯。

执行命令后,系统会向你提出几个问题:

  1. Enter file in which to save the key (...)
    这是询问你将密钥文件保存在哪里。直接按回车键即可,系统会使用默认路径(通常是 ~/.ssh/id_ed25519)。

  2. Enter passphrase (empty for no passphrase):
    这是让你为你的私钥设置一个密码 (Passphrase)。这是一个非常重要的额外安全层。

    • 设置密码:即使你的私钥文件不慎泄露,没有这个密码,攻击者也无法使用它。
    • 不设置密码:直接回车跳过。登录时会更方便,但安全性稍低。
    • 强烈建议设置一个健壮的密码!

完成后,你会在 ~/.ssh/ 目录下找到两个新文件:
* id_ed25519:你的私钥。
* id_ed25519.pub:你的公钥。

步骤二:将公钥复制到远程服务器

要让服务器认识你的公钥,你需要把它复制到服务器上。这里有两种方法。

方法一:使用 ssh-copy-id (推荐)

如果你的系统支持 ssh-copy-id 命令(Linux, macOS, Git Bash on Windows 都支持),这是最简单、最不容易出错的方法。

bash
ssh-copy-id user@your_server_ip

  • user 替换为你的服务器用户名。
  • your_server_ip 替换为服务器的IP地址或域名。

这个命令会自动将你的公钥(~/.ssh/id_ed25519.pub)追加到服务器上 user 用户家目录下的 ~/.ssh/authorized_keys 文件中,并且会自动设置正确的文件和目录权限。过程中会要求你输入一次服务器的登录密码。

方法二:手动复制

如果无法使用 ssh-copy-id,可以手动完成。

  1. 在本地显示并复制公钥内容
    bash
    cat ~/.ssh/id_ed25519.pub

    这条命令会把你的公钥内容打印在终端上,复制这一整串以 ssh-ed25519 开头、以你的邮箱结尾的文本。

  2. 登录到你的远程服务器(此时仍需使用密码):
    bash
    ssh user@your_server_ip

  3. 在服务器上,将公钥写入 authorized_keys 文件
    “`bash
    # 确保 .ssh 目录存在
    mkdir -p ~/.ssh

    将你复制的公钥粘贴到这里

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

    设置正确的文件权限(非常重要!)

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    ``
    **权限说明**:
    *
    ~/.ssh目录的权限必须是700(只有所有者能读、写、执行)。
    *
    ~/.ssh/authorized_keys文件的权限必须是600`(只有所有者能读、写)。
    如果权限不正确,SSH服务会因安全原因拒绝使用密钥登录。

步骤三:使用 SSH Key 登录

完成以上步骤后,退出服务器连接。然后再次尝试登录:

bash
ssh user@your_server_ip

这一次,系统将不再要求你输入服务器密码。如果之前为私钥设置了密码 (Passphrase),系统会提示你输入它。输入后即可成功登录。

小技巧:使用 ssh-agent 管理私钥密码
每次登录都输入私钥密码也有些麻烦。ssh-agent 是一个能帮你记住私钥密码的工具。你只需在会话开始时向 ssh-agent 添加一次私钥并输入密码,之后在该会话中的所有ssh连接就都不再需要输入了。
“`bash

启动 ssh-agent

eval “$(ssh-agent -s)”

添加你的私钥到 agent

ssh-add ~/.ssh/id_ed25519
“`


5. 总结

SSH Key是现代系统管理和软件开发中一项不可或缺的基础技术。它通过强大的非对称加密,提供了远超传统密码方式的安全性便利性

通过本文的学习,你应该已经掌握了:
* SSH Key是基于公钥和私钥的身份验证机制。
* 其工作原理是通过一次加密解密的“质询-响应”过程来验证身份,全程无需传输敏感信息。
* 掌握了 ssh-keygenssh-copy-id 等命令,具备了在实际工作中部署和使用SSH Key的能力。

从现在开始,告别繁琐且不安全的密码登录吧。为你所有的服务器和代码托管平台(如GitHub, GitLab)都配置上SSH Key,享受它带来的安全与高效。这绝对是一项值得你投入时间学习和实践的技能。

滚动至顶部