本文档介绍了OpenZeppelin Relayer中用于交易签名的signers配置,包括支持的signer类型(local, vault, vault_cloud, vault_transit, turnkey, google_cloud_kms, aws_kms),配置结构,以及它们在不同网络(EVM, Solana, Stellar)的兼容性,并提供了各种signer类型的详细配置示例和安全最佳实践。
签名者负责在交易提交到区块链网络之前对其进行加密签名。OpenZeppelin Relayer 支持多种签名者类型,以适应不同的安全需求和基础设施设置。
signers
配置中的数组必须包含至少一个有效的签名者配置。每个签名者都通过其 id
在 relayer(中继器)配置中被引用。
签名者配置示例:
"signers": [\
{\
"id": "my_id",\
"type": "local",\
"config": {\
"path": "config/keys/local-signer.json",\
"passphrase": {\
"type": "env",\
"value": "KEYSTORE_PASSPHRASE"\
}\
}\
}\
]
OpenZeppelin Relayer 支持以下签名者类型:
local
: Keystore(密钥库)文件签名者
vault
: HashiCorp Vault secret(密钥)签名者
vault_cloud
: Hosted HashiCorp Vault secret(托管的 HashiCorp Vault 密钥)签名者
vault_transit
: HashiCorp Vault Transit 签名者
turnkey
: Turnkey 签名者
google_cloud_kms
: Google Cloud KMS 签名者
aws_kms
: Amazon AWS KMS 签名者
下表显示了哪些签名者类型与每种网络类型兼容:
签名者类型 | EVM 网络 | Solana 网络 | Stellar 网络 |
---|---|---|---|
local |
✅ 支持 | ✅ 支持 | ✅ 支持 |
vault |
✅ 支持 | ✅ 支持 | ❌ 不支持 |
vault_cloud |
✅ 支持 | ✅ 支持 | ❌ 不支持 |
vault_transit |
❌ 不支持 | ✅ 支持 | ❌ 不支持 |
turnkey |
✅ 支持 | ✅ 支持 | ❌ 不支持 |
google_cloud_kms |
✅ 支持 | ✅ 支持 | ❌ 不支持 |
aws_kms |
✅ 支持 | ❌ 不支持 | ❌ 不支持 |
网络特定注意事项:<br>- EVM 网络:使用 secp256k1 密码学。大多数签名者都支持通过正确的密钥生成来支持 EVM 网络。<br> <br>- Solana 网络:使用 ed25519 密码学。确保你的签名者支持 ed25519 密钥生成和签名。<br> <br>- Stellar 网络:使用具有特定 Stellar 要求的 ed25519 密码学。由于网络特定的实现要求,签名者支持有限。<br> <br>- AWS KMS:当前针对具有 secp256k1 支持的 EVM 网络进行了优化。<br> <br>- Google Cloud KMS:同时支持 secp256k1 (EVM) 和 ed25519 (Solana) 密钥类型。<br> <br>- Turnkey:通过适当的密钥管理支持 EVM 和 Solana 网络。 |
所有签名者类型都共享这些常用配置字段:
字段 | 类型 | 描述 |
---|---|---|
id | String(字符串) | 签名者的唯一标识符(用于在 relayer(中继器)配置中引用此签名者) |
type | String(字符串) | 签名者的类型(请参见上面支持的签名者类型) |
config | Map(映射) | 签名者类型特定的配置对象 |
本地签名者使用存储在文件系统上的加密密钥库文件。
{
"id": "local-signer",
"type": "local",
"config": {
"path": "config/keys/local-signer.json",
"passphrase": {
"type": "env",
"value": "KEYSTORE_PASSPHRASE"
}
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
path | String(字符串) | 签名者 JSON 文件的路径。应位于 ./config 目录下 |
passphrase.type | String(字符串) | 密码来源的类型(env 或 plain ) |
passphrase.value | String(字符串) | 密码值或环境变量名称 |
使用 HashiCorp Vault 的密钥引擎来存储私钥。
{
"id": "vault-signer",
"type": "vault",
"config": {
"address": "https://vault.example.com",
"role_id": {
"type": "env",
"value": "VAULT_ROLE_ID"
},
"secret_id": {
"type": "env",
"value": "VAULT_SECRET_ID"
},
"key_name": "relayer-key",
"mount_point": "secret"
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
address | String(字符串) | 指定 Vault API 端点 |
role_id.type | String(字符串) | 值来源的类型(env 或 plain ) |
role_id.value | String(字符串) | Vault AppRole 角色标识符值,或者存储 AppRole 角色标识符的环境变量名称 |
secret_id.type | String(字符串) | 值来源的类型(env 或 plain ) |
secret_id.value | String(字符串) | Vault AppRole 角色密钥值,或者存储 AppRole 密钥值的环境变量名称 |
key_name | String(字符串) | Vault 密钥引擎中用于签名操作的加密密钥的名称 |
mount_point | String(字符串) | Vault 中 Secrets 引擎的挂载点。如果未明确指定,则默认为 secret 。 可选。 |
使用 HashiCorp Vault Cloud (HCP Vault) 进行密钥管理。
{
"id": "vault-cloud-signer",
"type": "vault_cloud",
"config": {
"client_id": "your-client-id",
"client_secret": {
"type": "env",
"value": "VAULT_CLOUD_CLIENT_SECRET"
},
"org_id": "your-org-id",
"project_id": "your-project-id",
"app_name": "relayer-app",
"key_name": "signing-key"
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
client_id | String(字符串) | 用于向 Vault Cloud 进行身份验证的客户端标识符 |
client_secret.type | String(字符串) | 值来源的类型(env 或 plain ) |
client_secret.value | String(字符串) | Vault 密钥值,或者存储密钥值的环境变量名称 |
org_id | String(字符串) | 你的 Vault Cloud 帐户的组织 ID |
project_id | String(字符串) | 唯一标识你的 Vault Cloud 项目的项目 ID |
app_name | String(字符串) | 与 Vault Cloud 集成的应用程序的名称 |
key_name | String(字符串) | 用于在 Vault Cloud 中进行签名或加密操作的加密密钥的名称 |
使用 HashiCorp Vault 的 Transit secrets 引擎进行加密操作。
{
"id": "vault-transit-signer",
"type": "vault_transit",
"config": {
"address": "https://vault.example.com",
"role_id": {
"type": "env",
"value": "VAULT_ROLE_ID"
},
"secret_id": {
"type": "env",
"value": "VAULT_SECRET_ID"
},
"key_name": "relayer-transit-key",
"mount_point": "transit",
"namespace": "production",
"pubkey": "your-public-key-here"
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
address | String(字符串) | 指定 Vault API 端点 |
role_id.type | String(字符串) | 值来源的类型(env 或 plain ) |
role_id.value | String(字符串) | Vault AppRole 角色标识符值,或者存储 AppRole 角色标识符的环境变量名称 |
secret_id.type | String(字符串) | 值来源的类型(env 或 plain ) |
secret_id.value | String(字符串) | Vault AppRole 角色密钥值,或者存储 AppRole 密钥值的环境变量名称 |
key_name | String(字符串) | Vault Transit 引擎中用于签名操作的加密密钥的名称 |
mount_point | String(字符串) | Vault 中 Transit secrets 引擎的挂载点。如果未明确指定,则默认为 transit 。 可选。 |
namespace | String(字符串) | 用于 API 调用的 Vault 命名空间。 这仅在 Vault Enterprise 环境中使用。 可选。 |
pubkey | String(字符串) | Vault's Transit 引擎中用于签名操作的加密密钥的公钥 |
使用 Turnkey 的安全密钥管理基础设施。
{
"id": "turnkey-signer",
"type": "turnkey",
"config": {
"api_public_key": "your-api-public-key",
"api_private_key": {
"type": "env",
"value": "TURNKEY_API_PRIVATE_KEY"
},
"organization_id": "your-org-id",
"private_key_id": "your-private-key-id",
"public_key": "your-public-key"
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
api_public_key | String(字符串) | 与你的 Turnkey API 访问凭据关联的公钥。 用于向 Turnkey 签名服务进行身份验证 |
api_private_key.type | String(字符串) | 值来源的类型(env 或 plain ) |
api_private_key.value | String(字符串) | Turnkey API 私钥或包含它的环境变量名称。 与公钥一起使用以验证 API 请求 |
organization_id | String(字符串) | 你的唯一 Turnkey 组织标识符。 需要访问你的特定组织内的资源 |
private_key_id | String(字符串) | Turnkey 帐户中私钥的唯一标识符,该私钥将用于签名操作 |
public_key | String(字符串) | 与 private_key_id 标识的私钥相对应的公钥。 用于地址派生和签名验证 |
使用 Google Cloud Key Management Service 进行安全密钥操作。
对于 EVM 交易签名,请确保使用以下内容创建 Google Cloud KMS 密钥:<br>- 保护级别:HSM<br>- 目的:非对称签名<br>- 算法:“椭圆曲线 secp256k1 - SHA256 摘要”<br>这提供了 Ethereum 交易所需的 secp256k1 兼容性。 |
{
"id": "gcp-kms-signer",
"type": "google_cloud_kms",
"config": {
"service_account": {
"project_id": "your-gcp-project",
"private_key_id": {
"type": "env",
"value": "GCP_PRIVATE_KEY_ID"
},
"private_key": {
"type": "env",
"value": "GCP_PRIVATE_KEY"
},
"client_email": {
"type": "env",
"value": "GCP_CLIENT_EMAIL"
},
"client_id": "your-client-id"
},
"key": {
"location": "us-west2",
"key_ring_id": "relayer-keyring",
"key_id": "relayer-key",
"key_version": 1
}
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
service_account.project_id | String(字符串) | 你的 KMS 资源所在的 Google Cloud 项目 ID |
service_account.private_key_id.type | String(字符串) | 私钥 ID 的值来源类型(env 或 plain ) |
service_account.private_key_id.value | String(字符串) | 私钥 ID 值或包含它的环境变量名称 |
service_account.private_key.type | String(字符串) | 私钥的值来源类型(env 或 plain ) |
service_account.private_key.value | String(字符串) | Google Cloud 服务帐户私钥 (PEM 格式) 或包含它的环境变量名称 |
service_account.client_email.type | String(字符串) | 客户端电子邮件的值来源类型(env 或 plain ) |
service_account.client_email.value | String(字符串) | Google Cloud 服务帐户客户端电子邮件或包含它的环境变量名称 |
service_account.client_id | String(字符串) | Google Cloud 服务帐户客户端 ID |
key.location | String(字符串) | 你的 KMS 密钥环所在的 Google Cloud 位置(区域)(例如,“us-west2”,“global”) |
key.key_ring_id | String(字符串) | 包含你的加密密钥的 KMS 密钥环 ID |
key.key_id | String(字符串) | 用于签名操作的 KMS 密钥 ID |
key.key_version | Integer(整数) | 用于签名操作的 KMS 密钥的版本。 默认为 1 |
使用 Amazon Web Services Key Management Service 进行加密操作。
{
"id": "aws-kms-signer",
"type": "aws_kms",
"config": {
"region": "us-west-2",
"key_id": "arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012"
}
}
配置字段:
字段 | 类型 | 描述 |
---|---|---|
region | String(字符串) | AWS 区域。 如果密钥未跨区域复制,则此项必须与密钥的原始区域匹配。 可选。 如果未指定,则使用共享凭证中的默认区域 |
key_id | String(字符串) | AWS KMS 中密钥的 ID(可以是密钥 ID、密钥 ARN、别名或别名 ARN) |
设置对密钥库文件的限制性权限:chmod 0500 config/keys/*
确保配置目录已正确保护
对密码和 API 密钥等敏感数据使用环境变量
在可用时,对生产环境使用 HSM 支持的密钥
实施适当的密钥轮换策略
切勿将私钥或敏感配置提交到版本控制
使用具有最少所需权限的专用服务帐户
对不同的环境(开发、暂存、生产)使用不同的签名者
在生产环境中实施适当的密钥管理
考虑使用云原生密钥管理服务来增强安全性
无效的密钥库密码
验证密码环境变量是否已正确设置
检查密钥库文件是否已损坏
确保密钥库格式兼容
Cloud KMS 身份验证失败
验证服务帐户凭据是否有效且格式正确
检查服务帐户是否具有 KMS 操作所需的必要权限
确保 KMS 密钥存在并且位于正确的区域/项目中
Vault 连接问题
验证 Vault 服务器地址和网络连接
检查 AppRole 凭据和权限
确保 secret/transit 引擎已正确挂载和配置
有关其他故障排除帮助,请检查应用程序日志并参阅特定的云提供商或服务文档。
- 原文链接: docs.openzeppelin.com/re...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!