跳转至

密钥管理 (中文)

R-VPN 使用 Ed25519 身份密钥进行身份验证。本指南涵盖密钥生成和管理。

密钥类型

密钥类型 用途 存储方式
身份密钥 (Identity Key) 长期身份标识 安全保存,备份
公钥 (Public Key) 与服务器共享 可以公开
预密钥包 (Prekey Bundle) 初始握手 服务器端

生成密钥

生成身份密钥

# 生成客户端身份密钥
rvpn keygen --output client_identity.key

# 使用默认输出文件名 (identity.key)
rvpn keygen

这将创建一个新的 Ed25519 密钥对。文件格式如下:

R-VPN-IDENTITY-v1
<base64 编码的公钥>
<base64 编码的私钥>

提取公钥

# 从身份密钥文件中提取公钥
rvpn pubkey --key client_identity.key --output client_public.key

# 使用默认输出文件名 (public.key)
rvpn pubkey --key client_identity.key

生成预密钥包

服务器管理员使用:

# 从服务器身份密钥生成预密钥包
rvpn prekey-bundle --identity server_identity.key --output bundle.json

或使用服务器二进制文件:

rvpn-server prekey-bundle --identity /etc/rvpn/server_identity.key --output bundle.json

预密钥包包含: - identity_key - 服务器的 Ed25519 身份公钥 (base64) - identity_x25519_key - 服务器用于 X3DH 的 X25519 身份密钥 (base64) - signed_prekey - 用于 X3DH 握手的 X25519 签名预密钥 (base64) - prekey_signature - 签名预密钥的签名 (base64) - one_time_prekey - 可选的一次性预密钥,用于增强前向保密 (base64)

获取服务器预密钥包

要连接到服务器,您需要服务器的预密钥包。可以通过以下方式获取:

  1. 从服务器管理员处获取 - 他们使用 prekey-bundle 命令生成
  2. 通过安全通道 - 通过安全方式共享 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

服务器密钥设置

服务器身份密钥

# 生成服务器身份密钥
rvpn-server keygen

# 或使用客户端二进制文件
rvpn keygen --output server_identity.key

提取公钥

rvpn pubkey --key server_identity.key --output server_public.key

server_public.key 分发给客户端用于服务器身份验证。

预密钥包

为客户端初始化生成预密钥包:

rvpn-server prekey-bundle --identity server_identity.key --output prekey-bundle.json

服务器还会生成一个私钥包 (prekey-bundle.private.json),其中包含签名预密钥的私钥,必须安全地保存在服务器上。

公钥包应通过 HTTPS 提供,供客户端在连接时获取。

密钥文件格式

身份密钥文件格式

R-VPN-IDENTITY-v1
<base64 公钥>
<base64 私钥>

示例:

R-VPN-IDENTITY-v1
AbCdEf123...xyz
XyZaBc456...789

公钥文件格式

R-VPN-PUBLICKEY-v1
<base64 公钥>

示例:

R-VPN-PUBLICKEY-v1
AbCdEf123...xyz

预密钥包格式 (JSON)

{
  "identity_key": "base64 编码的 Ed25519 公钥",
  "identity_x25519_key": "base64 编码的 X25519 公钥",
  "signed_prekey": "base64 编码的 X25519 签名预密钥",
  "prekey_signature": "base64 编码的 Ed25519 签名",
  "one_time_prekey": "base64 编码的 X25519 一次性预密钥 (可选)"
}

故障排除

无效的密钥格式

确保密钥文件没有损坏:

# 检查文件内容
head -n 1 client_identity.key
# 应输出: R-VPN-IDENTITY-v1

找不到密钥

验证配置中的路径:

[client]
identity_key_file = "/full/path/to/client_identity.key"

权限问题

密钥应具有受限权限:

# 检查当前权限
ls -la client_identity.key

# 修复权限
chmod 600 client_identity.key

预密钥包错误

如果遇到握手错误:

  1. 验证预密钥包是否从正确的身份密钥生成
  2. 检查包 JSON 是否有效且未损坏
  3. 确保服务器具有相应的私钥包

最佳实践

  1. 绝不共享私钥 - 保持身份密钥安全,绝不传输
  2. 备份密钥 - 将加密副本存储在安全位置
  3. 定期轮换 - 每 6-12 个月生成新密钥
  4. 使用强权限 - 对所有密钥文件使用 chmod 600
  5. 验证签名 - 首次连接前始终验证服务器公钥
  6. 安全删除 - 删除旧密钥时使用 shred 或类似工具
  7. 分离密钥 - 对不同服务器使用不同的身份密钥

下一步