密钥管理 (中文)¶
R-VPN 使用 Ed25519 身份密钥进行身份验证。本指南涵盖密钥生成和管理。
密钥类型¶
| 密钥类型 | 用途 | 存储方式 |
|---|---|---|
| 身份密钥 (Identity Key) | 长期身份标识 | 安全保存,备份 |
| 公钥 (Public Key) | 与服务器共享 | 可以公开 |
| 预密钥包 (Prekey Bundle) | 初始握手 | 服务器端 |
生成密钥¶
生成身份密钥¶
这将创建一个新的 Ed25519 密钥对。文件格式如下:
提取公钥¶
# 从身份密钥文件中提取公钥
rvpn pubkey --key client_identity.key --output client_public.key
# 使用默认输出文件名 (public.key)
rvpn pubkey --key client_identity.key
生成预密钥包¶
服务器管理员使用:
或使用服务器二进制文件:
预密钥包包含:
- identity_key - 服务器的 Ed25519 身份公钥 (base64)
- identity_x25519_key - 服务器用于 X3DH 的 X25519 身份密钥 (base64)
- signed_prekey - 用于 X3DH 握手的 X25519 签名预密钥 (base64)
- prekey_signature - 签名预密钥的签名 (base64)
- one_time_prekey - 可选的一次性预密钥,用于增强前向保密 (base64)
获取服务器预密钥包¶
要连接到服务器,您需要服务器的预密钥包。可以通过以下方式获取:
- 从服务器管理员处获取 - 他们使用
prekey-bundle命令生成 - 通过安全通道 - 通过安全方式共享 JSON 文件
预密钥包文件 (prekey-bundle.json) 包含 X3DH 握手所需的所有信息。
密钥安全¶
保护私钥¶
您的身份密钥是安全的核心:
# 设置严格的权限
chmod 600 client_identity.key
# 存储在安全位置
mkdir -p ~/.rvpn/keys/
mv client_identity.key ~/.rvpn/keys/
备份密钥¶
安全地备份您的身份密钥:
# 使用 GPG 加密后备份
gpg --symmetric --cipher-algo AES256 client_identity.key
# 或使用密码保护的加密
gpg --symmetric --armor client_identity.key
# 存储在安全位置
# - 密码管理器
# - 加密 USB 驱动器
# - 安全云存储
从备份恢复:
# 解密备份
gpg --decrypt client_identity.key.gpg > client_identity.key
# 设置正确的权限
chmod 600 client_identity.key
轮换密钥¶
定期轮换身份密钥以增强安全性:
# 生成新密钥
rvpn keygen --output new_client_identity.key
# 提取新公钥
rvpn pubkey --key new_client_identity.key --output new_public.key
# 使用新公钥更新服务器
# (联系您的 VPN 提供商并提供新公钥)
# 备份旧密钥
mv client_identity.key client_identity.key.old
# 切换到新密钥
mv new_client_identity.key client_identity.key
# 确认新密钥正常工作后,安全删除旧密钥
shred -u client_identity.key.old
服务器密钥设置¶
服务器身份密钥¶
提取公钥¶
将 server_public.key 分发给客户端用于服务器身份验证。
预密钥包¶
为客户端初始化生成预密钥包:
服务器还会生成一个私钥包 (prekey-bundle.private.json),其中包含签名预密钥的私钥,必须安全地保存在服务器上。
公钥包应通过 HTTPS 提供,供客户端在连接时获取。
密钥文件格式¶
身份密钥文件格式¶
示例:
公钥文件格式¶
示例:
预密钥包格式 (JSON)¶
{
"identity_key": "base64 编码的 Ed25519 公钥",
"identity_x25519_key": "base64 编码的 X25519 公钥",
"signed_prekey": "base64 编码的 X25519 签名预密钥",
"prekey_signature": "base64 编码的 Ed25519 签名",
"one_time_prekey": "base64 编码的 X25519 一次性预密钥 (可选)"
}
故障排除¶
无效的密钥格式¶
确保密钥文件没有损坏:
找不到密钥¶
验证配置中的路径:
权限问题¶
密钥应具有受限权限:
预密钥包错误¶
如果遇到握手错误:
- 验证预密钥包是否从正确的身份密钥生成
- 检查包 JSON 是否有效且未损坏
- 确保服务器具有相应的私钥包
最佳实践¶
- 绝不共享私钥 - 保持身份密钥安全,绝不传输
- 备份密钥 - 将加密副本存储在安全位置
- 定期轮换 - 每 6-12 个月生成新密钥
- 使用强权限 - 对所有密钥文件使用
chmod 600 - 验证签名 - 首次连接前始终验证服务器公钥
- 安全删除 - 删除旧密钥时使用
shred或类似工具 - 分离密钥 - 对不同服务器使用不同的身份密钥