轻量消息队列(原 MNS)支持服务端存储加密(Server-Side Encryption),对队列和主题中的消息体进行自动加密存储和解密读取,满足数据安全合规要求。加解密过程对消息的发送方和接收方完全透明,无需修改客户端代码。
工作原理
轻量消息队列使用信封加密(Envelope Encryption)机制。服务端使用数据加密密钥(DEK)加密消息体,再使用主密钥保护 DEK。发送消息时,服务端自动完成加密后写入存储;接收、订阅推送或消费消息时,服务端自动解密后返回明文消息体。
SSE-SMQ(服务托管密钥加密)和 SSE-KMS(用户自管密钥加密)的区别在于主密钥的管理方不同:SSE-SMQ 的密钥由轻量消息队列服务托管;SSE-KMS 使用在密钥管理服务 KMS 中管理的密钥。
支持的加密算法
算法 | 说明 |
AES-256-GCM(默认) | 国际标准认证加密 |
加密范围
存储加密仅加密消息体(MessageBody)。消息属性、系统属性(MessageId、EnqueueTime 等)和队列/主题元数据不加密。
加密方案
加密方案 | 密钥管理方 | 适用场景 | 费用 |
SSE-SMQ(服务托管密钥) | 轻量消息队列服务 | 快速启用加密,无需管理密钥 | 免费 |
SSE-KMS(用户自管密钥) | 用户通过 KMS 管理 | 对密钥有自主管控需求的场景 | KMS 侧计费,MNS 无额外收费。详情请参见KMS 计费方式 |
使用 SSE-KMS 时,MNS 使用信封加密并缓存数据加密密钥(DEK),KMS API 调用频率远低于消息收发频率。详细计费请参见 KMS 计费说明。
前提条件
存储加密功能当前需申请开通。请提交工单申请开放,提交工单时需提供主账号 UID、资源名称及所在地域。
使用 SSE-KMS 时,还需满足以下条件:
KMS 密钥需与队列或主题属于同一账号、同一地域。
KMS 密钥需为 AES-256 对称密钥(KMS KeySpec 为
Aliyun_AES_256)。需确保服务关联角色
AliyunMNSAccessingKMSRole具有访问指定 KMS 密钥的权限,包括kms:GenerateDataKey和kms:Decrypt。如控制台出现授权提示,请按页面指引完成服务关联角色授权。
配置存储加密
通过控制台配置
在左侧导航栏,选择队列模型 > 队列列表。
在顶部菜单栏,选择地域。
创建队列或编辑已有队列,在存储加密参数选项开启加密开关,选择加密方案(SSE-SMQ 或 SSE-KMS),然后单击确定。其他参数的设置,请参见队列操作。
主题(Topic)的操作方式与队列一致:在左侧导航栏选择,然后单击创建主题或编辑主题进行配置。
通过 API 配置
您可以在创建队列或修改队列属性时配置存储加密。主题的 CreateTopic、SetTopicAttributes 和 GetTopicAttributes 使用相同的加密参数。
参数 | 说明 |
| 是否开启存储加密。取值: |
| 加密方式。取值: |
| 加密算法。当前支持 |
| KMS 密钥 ID。仅 |
创建 SSE-SMQ 加密队列示例:
PUT /queues/{queueName} HTTP/1.1
<Queue>
<EnableSSE>true</EnableSSE>
<SSEType>SMQ</SSEType>
<SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
</Queue>创建 SSE-KMS 加密队列示例:
PUT /queues/{queueName} HTTP/1.1
<Queue>
<EnableSSE>true</EnableSSE>
<SSEType>KMS</SSEType>
<SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
<KMSKeyId>key-xxx</KMSKeyId>
</Queue>修改队列加密配置示例:
PUT /queues/{queueName}?metaoverride=true HTTP/1.1
<Queue>
<EnableSSE>true</EnableSSE>
<SSEType>KMS</SSEType>
<SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
<KMSKeyId>key-xxx</KMSKeyId>
</Queue>关闭队列加密示例:
PUT /queues/{queueName}?metaoverride=true HTTP/1.1
<Queue>
<EnableSSE>false</EnableSSE>
</Queue>查看加密状态
您可以通过控制台查看队列或主题的存储加密状态,也可以调用 GetQueueAttributes 或 GetTopicAttributes 查看加密字段。
HTTP/1.1 200 OK
<Queue>
<EnableSSE>true</EnableSSE>
<SSEType>KMS</SSEType>
<SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
<KMSKeyId>key-xxx</KMSKeyId>
</Queue>使用说明
您可以随时开启或关闭加密开关,也可以切换加密方式。配置变更后实时生效,新发送的消息将按照更新后的加密策略处理。
加密仅对新写入的消息生效,存量消息不会被回溯加密;关闭加密后,已加密的消息在密钥可用时仍可正常解密读取。
同一队列中可同时存在明文消息和加密消息,例如开启、关闭或切换加密方式后。
消息体大小限制基于加密前的原始大小计算。加密会引入约 30 字节的额外开销,但不影响用户可用的消息体大小上限。
开启存储加密后,消息收发会有一定性能开销,具体影响与消息大小、并发量和密钥缓存命中情况有关。
使用 SSE-KMS 时,KMS 密钥轮转后,新消息将使用新版本密钥加密,旧消息仍可通过 KMS 自动使用旧版本密钥解密。
如果将资源配置切换为另一个
KMSKeyId,仅新写入的消息使用新密钥;历史消息仍依赖写入时记录的旧KMSKeyId和加密元数据。请保留旧密钥及 kms:Decrypt 权限,直到旧消息全部过期、删除或确认无需读取。Topic 消息订阅推送到 Queue 时,MNS 会先解密源 Topic 消息,再按照目标队列当前的存储加密配置写入;如果目标队列开启 SSE,会使用目标队列的加密配置重新加密。HTTP 等非队列推送场景返回解密后的明文消息体。
死信队列(DLQ)是普通队列。Topic 订阅消息转入 DLQ 时,会按照目标 DLQ 队列的存储加密配置处理;Queue 自身消息转入 DLQ 时会保留原消息的加密状态和加密元数据,不会因目标 DLQ 队列开启 SSE 而重新加密。消费 DLQ 中的加密消息时,仍需原消息对应的 KMS 密钥可用。
重要注意事项
警告:使用 SSE-KMS 时,KMS 密钥被禁用、计划删除或删除将影响消息收发和已加密消息读取。
密钥被禁用:新消息发送失败,已加密的存量消息也无法解密读取;重新启用密钥后可恢复。
密钥处于计划删除(PendingDeletion)状态:行为同禁用;如删除流程完成,使用该密钥加密的数据将永久不可解密。
密钥已删除:使用该密钥加密的数据永久不可解密。
服务关联角色
AliyunMNSAccessingKMSRole被删除或权限被收回:SSE-KMS 加密、解密请求将因无权限而失败。更换
KMSKeyId后,请勿立即禁用或删除旧密钥;旧消息、旧 DLQ 消息或仍在投递链路中的消息可能仍依赖旧密钥解密。
常见错误码及处理建议如下:
错误码 | 常见原因 | 处理建议 |
| 开启 SSE-KMS 但未配置 | 配置同账号、同地域的 AES-256 对称 KMS 密钥后重试。 |
| KMS 密钥被禁用,或处于不可用于加解密的状态。 | 在 KMS 控制台启用密钥;如密钥处于计划删除状态,请先取消删除。 |
|
| 校验 |
| 服务关联角色缺少 | 按控制台授权提示修复 |
| KMS 临时不可用、限流、网络异常或内部错误。 | 稍后重试;如果持续出现,请记录 RequestId 并联系技术支持。 |
| 加解密过程失败,可能与密钥状态、权限或消息加密元数据异常有关。 | 先检查密钥状态和角色权限;仍无法恢复时,请携带 RequestId、队列/主题名称和时间范围联系技术支持。 |
常见问题
开启加密后需要改代码吗?
不需要,加解密在服务端透明完成。
能切换加密方式吗?
可以,新消息使用新的加密方式处理,旧消息在对应密钥可用时仍可正常解密。
如何确认加密已生效?
可以在控制台查看队列或主题的存储加密状态,也可以调用 GetQueueAttributes 或 GetTopicAttributes 查看 EnableSSE、SSEType、SSEAlgorithm 和 KMSKeyId 等字段。
开启加密后对性能有影响吗?
有一定性能开销,延迟可能略有增加。具体影响与消息大小、并发量和密钥缓存命中情况有关。
SSE-KMS 的 KMS 调用费用怎么估算?
SSE-KMS 涉及 KMS 侧计费。MNS 使用信封加密并缓存 DEK,KMS API 调用频率远低于消息收发频率。具体费用请参见 KMS 计费说明。
KMS 密钥支持轮转吗?
支持。KMS 密钥轮转后,新消息使用新版本密钥加密,旧消息仍可通过 KMS 自动使用旧版本密钥解密。
能否禁用 KMS 密钥?
强烈不建议。禁用或删除 KMS 密钥后,关联队列或主题的消息收发将立即失败;密钥删除后,使用该密钥加密的数据将永久不可解密。