From c0b5f158955b6bb3576ae1b6efd3ad983cb1ec91 Mon Sep 17 00:00:00 2001 From: voson Date: Wed, 28 Jan 2026 10:57:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(gitea):=20=E6=B7=BB=E5=8A=A0=20SSH=20?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- opencode.json | 7 +- skill/gitea/SKILL.md | 10 +- skill/gitea/ssh-key-management.md | 254 ++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+), 9 deletions(-) create mode 100644 skill/gitea/ssh-key-management.md diff --git a/opencode.json b/opencode.json index 2539f9e..a18383d 100644 --- a/opencode.json +++ b/opencode.json @@ -19,10 +19,5 @@ } } }, - "zhipuai-coding-plan": { - "options": { - "apiKey": "0f76aea86295476dbfa98724013b0fe8.o2EaJVqcl4Cf7WLP" - } - } } -} \ No newline at end of file +} diff --git a/skill/gitea/SKILL.md b/skill/gitea/SKILL.md index 3d4b5b9..607f952 100644 --- a/skill/gitea/SKILL.md +++ b/skill/gitea/SKILL.md @@ -87,6 +87,7 @@ C:\Users\YourUsername\.config\gitea\ | 功能模块 | 文档 | 说明 | |---------|------|------| | 环境配置 | [setup-guide.md](./setup-guide.md) | 首次使用引导,配置 Gitea URL 和 Token | +| SSH 密钥管理 | [ssh-key-management.md](./ssh-key-management.md) | 创建、部署 SSH 密钥,配置本地客户端 | | Runner 管理 | [runner-management.md](./runner-management.md) | 创建、注册、管理 Gitea Act Runner | | 自动创建脚本 | [create-runner.md](./create-runner.md) | 包含完整的 Runner 创建 Bash 脚本 | | Workflow 生成 | [workflow-generator.md](./workflow-generator.md) | 根据项目类型生成 CI/CD workflow | @@ -102,6 +103,7 @@ C:\Users\YourUsername\.config\gitea\ - "生成 workflow"、"CI/CD" - "创建仓库"、"gitea 仓库" - "gitea 配置"、"gitea token" +- "ssh key"、"ssh密钥"、"gitea ssh"、"部署密钥" ## 首次使用 @@ -130,6 +132,7 @@ C:\Users\YourUsername\.config\gitea\ | `/gitea-config` | 查看当前 Gitea 配置和 Runner 状态 | | `/gitea-reset` | 重置 Gitea 配置(交互式向导) | | `/gitea-switch-org` | 切换默认组织 | +| `/gitea-setup-ssh` | 创建 SSH 密钥并部署到 Gitea 服务器 | | `/gitea-create-runner` | 创建并启动新 Runner(默认 host 模式) | | `/gitea-list-runners` | 列出所有 Runner 及其状态 | | `/gitea-delete-runner` | 删除指定 Runner | @@ -424,9 +427,9 @@ AI 会自动: ## 版本 -- **Skill Version**: 1.1 -- **Last Updated**: 2026-01-23 -- **整合内容**: gitea-runner + gitea-workflow + 增强仓库管理 +- **Skill Version**: 1.2 +- **Last Updated**: 2026-01-28 +- **整合内容**: gitea-runner + gitea-workflow + 增强仓库管理 + SSH 密钥管理 - **主要改进**: - 仓库创建智能解析(优先使用指定组织) - **简化验证**:默认假设组织存在,API失败时提示创建组织 @@ -434,6 +437,7 @@ AI 会自动: - **完整 Git 集成**:自动检查Git状态,提供一键初始化、提交、推送 - **简洁高效**:减少预先验证,API失败时给出具体解决方案 - 工作目录概念澄清(配置 vs 仓库操作) + - **SSH 密钥管理**:完整的密钥创建、部署和跨设备使用指南 ## 相关资源 diff --git a/skill/gitea/ssh-key-management.md b/skill/gitea/ssh-key-management.md new file mode 100644 index 0000000..7f65438 --- /dev/null +++ b/skill/gitea/ssh-key-management.md @@ -0,0 +1,254 @@ +# SSH 密钥管理 + +完整的 SSH 密钥创建、部署和配置流程,支持跨设备使用。 + +## 命令 + +### `/gitea-setup-ssh` +创建 SSH 密钥对,部署公钥到 Gitea 服务器,配置本地 SSH 客户端。 + +## 功能概述 + +1. **生成 SSH 密钥对** (RSA 4096 位) +2. **部署公钥到 Gitea 服务器** (通过 API) +3. **配置本地 SSH 客户端** +4. **验证 SSH 连接** + +## 详细流程 + +### 1. 生成 SSH 密钥对 + +```bash +ssh-keygen -t rsa -b 4096 -f ~/.ssh/gitea_server_key -N "" +``` + +**生成的密钥文件:** +- 私钥:`~/.ssh/gitea_server_key` +- 公钥:`~/.ssh/gitea_server_key.pub` + +### 2. 部署公钥到 Gitea + +通过 Gitea API 将公钥添加到用户账户: + +```bash +curl -s -X POST -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"title\":\"server-key\",\"key\":\"$(cat ~/.ssh/gitea_server_key.pub)\"}" \ + "$GITEA_URL/api/v1/user/keys" +``` + +### 3. 配置本地 SSH 客户端 + +在 `~/.ssh/config` 中添加配置: + +```bash +cat >> ~/.ssh/config << 'EOF' + +Host git.refining.app + HostName git.refining.app + User git + IdentityFile ~/.ssh/gitea_server_key + IdentitiesOnly yes +EOF +``` + +### 4. 添加服务器主机密钥 + +```bash +ssh-keyscan git.refining.app >> ~/.ssh/known_hosts +``` + +### 5. 验证连接 + +```bash +ssh -T git@git.refining.app +``` + +成功输出: +``` +Hi there, username! You've successfully authenticated with the key named server-key... +``` + +## 跨设备使用 + +### 复制密钥到新设备 + +1. **复制私钥文件**到新设备的 `~/.ssh/` 目录 + ```bash + # 在源设备上查看私钥内容 + cat ~/.ssh/gitea_server_key + + # 在新设备上创建文件 + echo "-----BEGIN OPENSSH PRIVATE KEY-----" > ~/.ssh/gitea_server_key + echo "MIIEog..." >> ~/.ssh/gitea_server_key + echo "...cQ=" >> ~/.ssh/gitea_server_key + echo "-----END OPENSSH PRIVATE KEY-----" >> ~/.ssh/gitea_server_key + ``` + +2. **设置正确的权限** + ```bash + chmod 600 ~/.ssh/gitea_server_key + ``` + +3. **配置 SSH 客户端** + ```bash + # 在新设备上编辑 ~/.ssh/config + cat >> ~/.ssh/config << 'EOF' + + Host git.refining.app + HostName git.refining.app + User git + IdentityFile ~/.ssh/gitea_server_key + IdentitiesOnly yes + EOF + ``` + +4. **添加服务器主机密钥** + ```bash + ssh-keyscan git.refining.app >> ~/.ssh/known_hosts + ``` + +5. **测试连接** + ```bash + ssh -T git@git.refining.app + ``` + + +## 密钥位置说明 + +### 源设备(当前已配置) +``` +~/.ssh/ +├── gitea_server_key # 私钥 (权限 600) +├── gitea_server_key.pub # 公钥 (已部署到 Gitea) +├── config # SSH 配置 +└── known_hosts # 服务器主机密钥 +``` + +### 新设备(需要配置) +需要从源设备复制: +1. `gitea_server_key` - **私钥**(核心文件) +2. `~/.ssh/config` - SSH 配置(相关部分) +3. `known_hosts` - 服务器主机密钥(可选,会自动获取) + +## 安全注意事项 + +### ✅ 推荐做法 +1. **私钥权限设置为 600** + ```bash + chmod 600 ~/.ssh/gitea_server_key + ``` + +2. **不分享私钥** + - 私钥应保持在个人设备上 + - 仅在有信任关系的设备间复制 + +3. **使用强密码保护** + - 生成密钥时可添加密码:`ssh-keygen -t rsa -b 4096 -f ~/.ssh/gitea_server_key` + - 每次使用时需要输入密码 + +### ❌ 禁止行为 +1. 不要将私钥提交到 Git 仓库 +2. 不要通过不安全渠道传输私钥 +3. 不要设置过于宽松的权限(如 644、777) + +## 故障排除 + +### 1. 权限错误 +``` +Permissions 0644 for '/Users/username/.ssh/gitea_server_key' are too open. +``` +**解决方案**: +```bash +chmod 600 ~/.ssh/gitea_server_key +``` + +### 2. 主机密钥验证失败 +``` +Host key verification failed. +``` +**解决方案**: +```bash +ssh-keyscan git.refining.app >> ~/.ssh/known_hosts +``` + +### 3. 认证失败 +``` +git@git.refining.app: Permission denied (publickey). +``` +**检查步骤**: +1. 确认私钥文件存在且权限正确 +2. 确认 SSH 配置正确 +3. 确认公钥已添加到 Gitea + ```bash + curl -s -H "Authorization: token $GITEA_TOKEN" \ + "$GITEA_URL/api/v1/user/keys" | jq -r '.[].title' + ``` + +## Git 使用示例 + +### 克隆仓库 +```bash +git clone git@git.refining.app:username/repository.git +``` + +### 更新现有仓库的 remote URL +```bash +git remote set-url origin git@git.refining.app:username/repository.git +``` + +### 查看当前 remote URL +```bash +git remote -v +``` + + + +## 撤销密钥访问 + +如果密钥泄露或设备丢失: + +1. **登录 Gitea Web 界面** +2. 进入 **Settings → SSH/GPG Keys** +3. 找到对应的密钥并删除 + +2. **通过 API 删除** +```bash +# 首先获取密钥 ID +curl -s -H "Authorization: token $GITEA_TOKEN" \ + "$GITEA_URL/api/v1/user/keys" | jq '.[] | select(.title=="server-key").id' + +# 删除密钥(将 {id} 替换为实际 ID) +curl -s -X DELETE -H "Authorization: token $GITEA_TOKEN" \ + "$GITEA_URL/api/v1/user/keys/{id}" +``` + +3. **在受影响的设备上删除私钥** +```bash +rm ~/.ssh/gitea_server_key +rm ~/.ssh/gitea_server_key.pub +``` + +## 相关命令 + +### 查看 Gitea 上的所有 SSH 密钥 +```bash +curl -s -H "Authorization: token $GITEA_TOKEN" \ + "$GITEA_URL/api/v1/user/keys" | jq -r '.[] | "\(.id): \(.title) (\(.fingerprint))"' +``` + +### 测试 SSH 连接(详细模式) +```bash +ssh -T -v git@git.refining.app +``` + +### 检查 SSH 配置语法 +```bash +ssh -G git.refining.app +``` + +--- + +*文档版本:1.1* +*最后更新:2026-01-28* +*集成到 Gitea Skill v1.2* \ No newline at end of file