GitHub 是开发者常用的代码托管平台,使用 SSH 密钥登录可以简化身份验证流程,提高安全性和效率。然而,在配置过程中可能会遇到问题,例如常见的 Connection refused 错误。本文将详细介绍如何配置 SSH 密钥登录 GitHub,并解决常见的连接问题,特别针对端口 22 被封锁的情况。

为什么使用 SSH 密钥?

相比 HTTPS,SSH 密钥登录有以下优势:

  • 无需反复输入密码:通过密钥对认证,推送和拉取代码更便捷。
  • 更高的安全性:SSH 密钥基于公钥加密,难以被破解。
  • 支持复杂网络环境:通过配置(如使用端口 443),可以绕过防火墙限制。

步骤 1:检查和生成 SSH 密钥

检查现有密钥

在终端运行以下命令,检查是否已有 SSH 密钥:

  1. ls -al ~/.ssh

如果看到 id_rsaid_rsa.pubid_ed25519id_ed25519.pub,说明已有密钥,可跳到步骤 2。否则,继续生成新密钥。

生成新密钥

运行以下命令生成新的 SSH 密钥(将 your_email@example.com 替换为你的 GitHub 邮箱):

  1. ssh-keygen -t ed25519 -C "your_email@example.com"

如果系统不支持 ed25519,使用:

  1. ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • 按回车接受默认文件路径(通常是 ~/.ssh/id_ed25519~/.ssh/id_rsa)。
  • 可选择设置密码保护密钥(可选,建议设置以增强安全性)。

完成后,私钥(如 id_ed25519)和公钥(如 id_ed25519.pub)会保存在 ~/.ssh 目录。

步骤 2:将公钥添加到 GitHub

  1. 复制公钥到剪贴板:

    1. cat ~/.ssh/id_ed25519.pub

    1. cat ~/.ssh/id_rsa.pub

    复制输出的内容(以 ssh-ed25519ssh-rsa 开头)。

  2. 登录 GitHub:

    • 点击右上角头像 -> Settings -> SSH and GPG keys
    • 点击 New SSH keyAdd SSH key
    • 为密钥命名(例如“我的电脑”),粘贴公钥,点击 Add SSH key

步骤 3:启动 SSH 代理并添加密钥

  1. 启动 SSH 代理:

    1. eval "$(ssh-agent -s)"

    输出类似 Agent pid 1234 表示代理启动成功。

  2. 添加私钥到代理:

    1. ssh-add ~/.ssh/id_ed25519

    1. ssh-add ~/.ssh/id_rsa

    如果设置了密码,输入密码以解锁密钥。

步骤 4:测试 SSH 连接

运行以下命令测试与 GitHub 的连接:

  1. ssh -T git@github.com

成功时,你会看到类似 Hi username! You've successfully authenticated... 的消息。

解决常见错误:Connection refused

如果遇到 ssh: connect to host github.com port 22: Connection refused,说明端口 22 被网络防火墙或 ISP 封锁。以下是解决方法:

  1. 检查网络

    • 确认网络连接正常:
      1. ping github.com
    • 如果网络受限(如公司网络或公共 Wi-Fi),端口 22 可能被封锁。
  2. 使用端口 443 连接: GitHub 支持通过端口 443(通常用于 HTTPS 流量,较少被封锁)进行 SSH 连接。编辑或创建 ~/.ssh/config 文件:

    1. nano ~/.ssh/config

    添加以下内容:

    1. Host github.com
    2. HostName ssh.github.com
    3. User git
    4. Port 443
    5. IdentityFile ~/.ssh/id_ed25519
    • 说明
      • Host github.com:定义触发配置的别名。
      • HostName ssh.github.com:指定 GitHub 的备用 SSH 服务器。
      • User git:GitHub SSH 连接使用的统一用户名。
      • Port 443:使用 443 端口绕过 22 端口限制。
      • IdentityFile:指定你的私钥文件路径。
    • 保存后设置文件权限:
      1. chmod 600 ~/.ssh/config
    • 再次测试:
      1. ssh -T git@github.com
  3. 检查防火墙

    • 如果本地有防火墙(如 ufw),确保允许端口 22 或 443:
      1. sudo ufw allow 22
      2. sudo ufw allow 443
    • 临时禁用防火墙测试:
      1. sudo ufw disable
  4. 调试连接

    • 使用详细模式检查问题:
      1. ssh -vT git@github.com
    • 检查输出,确认是否尝试连接正确的服务器和端口。

步骤 5:配置 Git 使用 SSH

确保你的 Git 仓库使用 SSH 协议。检查远程 URL:

  1. git remote -v

如果显示 https:// 开头,切换到 SSH:

  1. git remote set-url origin git@github.com:username/repository.git

步骤 6:验证 Git 操作

尝试推送代码:

  1. git push origin main

如果无需输入用户名和密码,说明 SSH 配置成功。

额外注意事项

  • 文件权限: 确保 ~/.ssh 目录和密钥文件权限苗权限正确:

    1. chmod 700 ~/.ssh
    2. chmod 600 ~/.ssh/id_*
  • 备用方案: 如果 SSH 仍无法使用,可以临时切换到 HTTPS 协议:

    1. git remote set-url origin https://github.com/username/repository.git

    但 HTTPS 需要每次输入用户名和个人访问令牌(PAT)。

  • 检查 GitHub 状态: 访问 https://www.githubstatus.com/,确认 GitHub 服务正常。

  • 密钥类型: GitHub 支持 ed25519rsa 密钥。推荐使用 ed25519,因为它更安全且生成速度更快。

总结

通过以上步骤,你可以成功配置 SSH 密钥登录 GitHub,并通过端口 443 解决 Connection refused 错误。这种配置不仅适用于 GitHub,也可扩展到其他 Git 托管平台(如 GitLab、Bitbucket)。如果仍遇到问题,可以:

  • 检查 ssh -vT git@github.com 的详细输出。
  • 确认网络环境(公司网络、VPN 或公共 Wi-Fi)是否有限制。
  • 联系网络管理员开放端口 22 或 443。