Gogs添加公钥报错:公钥内容已被使用,求解决方案
排查与解决方案
听起来你遇到了Gogs里公钥添加的棘手问题,结合你有服务器和数据库权限的情况,我整理了几个针对性的排查和解决步骤,应该能帮你搞定:
检查数据库中已存在的公钥记录
Gogs的公钥唯一性校验是基于数据库存储的,提示“Public key content has been used”说明该公钥内容已经在数据库里存在,哪怕不是当前用户添加的。你可以直接查询数据库确认:- 登录Gogs数据库(根据你的配置选择SQLite或MySQL命令):
- SQLite:
sqlite3 /path/to/gogs/data/gogs.db - MySQL:
mysql -u [数据库用户名] -p gogs
- SQLite:
- 执行查询语句:
SELECT id, owner_id, content FROM public_key; - 将用户要添加的公钥内容和查询结果对比,看是否被其他用户(包括已删除的用户)占用。
- 登录Gogs数据库(根据你的配置选择SQLite或MySQL命令):
清理残留的已删除用户公钥
有时候用户被删除后,对应的公钥记录可能残留在数据库中,导致新用户无法添加相同公钥(哪怕你换了多组PuTTY密钥,也可能这些密钥之前被测试用户添加过):- 先查询用户表确认有效用户:
SELECT id, name FROM user; - 如果公钥对应的
owner_id不在有效用户列表里,直接删除这条残留记录:DELETE FROM public_key WHERE id = [残留公钥的ID];
- 先查询用户表确认有效用户:
修正PuTTY密钥格式
PuTTY生成的公钥默认格式和Gogs要求的OpenSSH格式可能不兼容,Gogs只支持开头为ssh-rsa/ssh-ed25519这类标准OpenSSH格式的公钥:- 打开PuTTYgen,加载用户的
.ppk私钥文件 - 点击
Conversions->Export OpenSSH key,导出兼容格式的私钥 - 复制PuTTYgen界面中“Public key for pasting into OpenSSH authorized_keys file”框内的内容,这才是符合Gogs要求的公钥格式,再尝试添加。
- 打开PuTTYgen,加载用户的
检查并修复数据库唯一性约束
确认public_key表的content字段是否存在唯一约束,这是Gogs校验公钥唯一性的核心:- SQLite:执行
PRAGMA table_info(public_key);,查看content字段是否有UNIQUE标记 - MySQL:执行
DESCRIBE public_key;,查看content字段的Key列是否为UNI - 如果约束缺失,手动添加:
- MySQL:
ALTER TABLE public_key ADD UNIQUE(content); - SQLite:
CREATE UNIQUE INDEX idx_public_key_content ON public_key(content);
- MySQL:
- SQLite:执行
重启Gogs服务生效
修改数据库后,重启Gogs服务确保缓存刷新:- 若用systemd管理:
systemctl restart gogs - 直接进程操作:
killall gogs && /path/to/gogs/gogs web
- 若用systemd管理:
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

