AWS License Manager缺失SignedToken的获取与使用问题咨询
AWS License Manager CheckoutLicense 无SignedToken问题排查及相关疑问解答
一、CheckoutLicense无SignedToken的核心原因及前置要求
首先明确:文档中的customer master key(CMK)就是客户托管密钥,且必须满足以下全部条件,调用CheckoutLicense才会返回SignedToken:
- 许可证颁发者必须关联非对称类型的客户托管CMK(对称CMK无法生成签名,AWS托管CMK也不支持该场景)
- 许可证配置中需启用签名要求(创建许可证时需指定签名密钥)
- 调用
CheckoutLicense的IAM实体需拥有目标CMK的kms:Sign权限,同时License Manager服务主体license-manager.amazonaws.com也需具备该CMK的kms:Sign权限 --key-fingerprint参数必须完全匹配关联CMK的官方指纹格式,正确格式为aws:<account-id>:<cmk-key-id/alias>:<cmk-fingerprint>(可通过aws kms describe-key获取KeyFingerprint字段值)
二、获取SignedToken的必要操作
- 配置合法的非对称CMK
- 创建或选择一个非对称客户托管CMK(KeySpec为RSA_2048/RSA_4096/ECC_prime256v1等类型)
- 更新CMK的密钥策略,添加允许License Manager服务执行
kms:Sign的语句:{ "Sid": "AllowLicenseManagerSign", "Effect": "Allow", "Principal": { "Service": "license-manager.amazonaws.com" }, "Action": "kms:Sign", "Resource": "*" }
- 关联CMK到许可证颁发者
- 创建许可证颁发者时,指定该非对称CMK作为签名密钥;若已创建颁发者,可通过
aws license-manager update-issuer命令关联CMK
- 创建许可证颁发者时,指定该非对称CMK作为签名密钥;若已创建颁发者,可通过
- 确保许可证启用签名
- 创建许可证时,在
SignKey字段中指定关联的CMK ARN;已存在的许可证可通过aws license-manager update-license修改配置
- 创建许可证时,在
- 修正CheckoutLicense请求参数
- 使用从
aws kms describe-key获取的官方KeyFingerprint值填充--key-fingerprint参数,避免自定义格式
- 使用从
三、SignedToken的签名依据与用途
- 签名依据:SignedToken是基于许可证核心元数据(许可证ID、SKU、授权项、有效期、客户端Token等),通过关联CMK的私钥进行数字签名生成的JWT格式令牌
- 用途:用于客户端应用的许可证合法性验证——应用可获取CMK的公钥,对SignedToken进行验签,确认许可证由合法颁发者签发且内容未被篡改,以此控制应用的授权访问
四、排查与验证步骤
- 验证CMK配置
执行以下命令确认CMK类型和权限:# 查看CMK详情,确认KeyManager为CUSTOMER,KeySpec为非对称类型 aws kms describe-key --key-id <your-cmk-id> # 查看CMK密钥策略,确认License Manager有kms:Sign权限 aws kms get-key-policy --key-id <your-cmk-id> --policy-name default - 验证许可证配置
执行命令确认许可证已关联签名密钥:
检查响应中是否存在aws license-manager get-license --license-arn <your-license-arn>SignKey字段,且值为目标CMK的ARN - 修正并重新调用CheckoutLicense
使用正确的--key-fingerprint重新执行命令,示例:aws license-manager checkout-license \ --product-sku MEOW15908721395 \ --checkout-type PROVISIONAL \ --key-fingerprint "aws:<your-account-id>:<cmk-key-id>:<cmk-fingerprint>" \ --entitlements "Name=Entitlement1,Value=1,Unit=Count" \ --client-token $(uuidgen) - C++ SDK排查
- 确保使用最新版本的AWS C++ SDK(旧版本可能存在字段映射漏洞)
- 调用
CheckoutLicense后,先检查响应的CheckoutStatus是否为SUCCESSFUL,再调用GetSignedToken()
内容的提问来源于stack exchange,提问作者StackOverflow Neko
相关产品推荐
相关产品推荐

