GitHub 是开发者常用的代码托管平台,使用 SSH 密钥登录可以简化身份验证流程,提高安全性和效率。然而,在配置过程中可能会遇到问题,例如常见的 Connection refused 错误。本文将详细介绍如何配置 SSH 密钥登录 GitHub,并解决常见的连接问题,特别针对端口 22 被封锁的情况。
为什么使用 SSH 密钥?
相比 HTTPS,SSH 密钥登录有以下优势:
- 无需反复输入密码:通过密钥对认证,推送和拉取代码更便捷。
- 更高的安全性:SSH 密钥基于公钥加密,难以被破解。
- 支持复杂网络环境:通过配置(如使用端口 443),可以绕过防火墙限制。
步骤 1:检查和生成 SSH 密钥
检查现有密钥
在终端运行以下命令,检查是否已有 SSH 密钥:
ls -al ~/.ssh
如果看到 id_rsa
和 id_rsa.pub
或 id_ed25519
和 id_ed25519.pub
,说明已有密钥,可跳到步骤 2。否则,继续生成新密钥。
生成新密钥
运行以下命令生成新的 SSH 密钥(将 your_email@example.com
替换为你的 GitHub 邮箱):
ssh-keygen -t ed25519 -C "your_email@example.com"
如果系统不支持 ed25519
,使用:
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
复制公钥到剪贴板:
cat ~/.ssh/id_ed25519.pub
或
cat ~/.ssh/id_rsa.pub
复制输出的内容(以
ssh-ed25519
或ssh-rsa
开头)。登录 GitHub:
- 点击右上角头像 -> Settings -> SSH and GPG keys。
- 点击 New SSH key 或 Add SSH key。
- 为密钥命名(例如“我的电脑”),粘贴公钥,点击 Add SSH key。
步骤 3:启动 SSH 代理并添加密钥
启动 SSH 代理:
eval "$(ssh-agent -s)"
输出类似
Agent pid 1234
表示代理启动成功。添加私钥到代理:
ssh-add ~/.ssh/id_ed25519
或
ssh-add ~/.ssh/id_rsa
如果设置了密码,输入密码以解锁密钥。
步骤 4:测试 SSH 连接
运行以下命令测试与 GitHub 的连接:
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 封锁。以下是解决方法:
检查网络:
- 确认网络连接正常:
ping github.com
- 如果网络受限(如公司网络或公共 Wi-Fi),端口 22 可能被封锁。
- 确认网络连接正常:
使用端口 443 连接: GitHub 支持通过端口 443(通常用于 HTTPS 流量,较少被封锁)进行 SSH 连接。编辑或创建
~/.ssh/config
文件:nano ~/.ssh/config
添加以下内容:
Host github.com
HostName ssh.github.com
User git
Port 443
IdentityFile ~/.ssh/id_ed25519
- 说明:
Host github.com
:定义触发配置的别名。HostName ssh.github.com
:指定 GitHub 的备用 SSH 服务器。User git
:GitHub SSH 连接使用的统一用户名。Port 443
:使用 443 端口绕过 22 端口限制。IdentityFile
:指定你的私钥文件路径。
- 保存后设置文件权限:
chmod 600 ~/.ssh/config
- 再次测试:
ssh -T git@github.com
检查防火墙:
- 如果本地有防火墙(如
ufw
),确保允许端口 22 或 443:sudo ufw allow 22
sudo ufw allow 443
- 临时禁用防火墙测试:
sudo ufw disable
- 如果本地有防火墙(如
调试连接:
- 使用详细模式检查问题:
ssh -vT git@github.com
- 检查输出,确认是否尝试连接正确的服务器和端口。
- 使用详细模式检查问题:
步骤 5:配置 Git 使用 SSH
确保你的 Git 仓库使用 SSH 协议。检查远程 URL:
git remote -v
如果显示 https://
开头,切换到 SSH:
git remote set-url origin git@github.com:username/repository.git
步骤 6:验证 Git 操作
尝试推送代码:
git push origin main
如果无需输入用户名和密码,说明 SSH 配置成功。
额外注意事项
文件权限: 确保
~/.ssh
目录和密钥文件权限苗权限正确:chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_*
备用方案: 如果 SSH 仍无法使用,可以临时切换到 HTTPS 协议:
git remote set-url origin https://github.com/username/repository.git
但 HTTPS 需要每次输入用户名和个人访问令牌(PAT)。
检查 GitHub 状态: 访问
https://www.githubstatus.com/
,确认 GitHub 服务正常。密钥类型: GitHub 支持
ed25519
和rsa
密钥。推荐使用ed25519
,因为它更安全且生成速度更快。
总结
通过以上步骤,你可以成功配置 SSH 密钥登录 GitHub,并通过端口 443 解决 Connection refused
错误。这种配置不仅适用于 GitHub,也可扩展到其他 Git 托管平台(如 GitLab、Bitbucket)。如果仍遇到问题,可以:
- 检查
ssh -vT git@github.com
的详细输出。 - 确认网络环境(公司网络、VPN 或公共 Wi-Fi)是否有限制。
- 联系网络管理员开放端口 22 或 443。