

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用服务器端加密设置 Amazon SNS 主题加密
<a name="sns-enable-encryption-for-topic"></a>

Amazon SNS 支持服务器端加密（SSE）使用 AWS Key Management Service （AWS KMS）来保护消息内容。按照以下说明使用 Amazon SNS 控制台或 CDK 启用 SSE。

## 选项 1：使用启用加密 AWS 管理控制台
<a name="enable-encryption-console"></a>

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 导航到**主题**页面，选择您的**主题**，然后选择**编辑**。

1. 展开**加密**部分并执行以下操作：
   + 将加密切换为**启用**。
   + 选择 **AWS 托管式 SNS 密钥**（alias/aws/sns）作为加密密钥。此选项默认处于选中状态。

1. 选择**保存更改**。

**注意**  
如果 AWS 托管式密钥 尚不存在，则会自动创建。
如果您看不到密钥或权限不足，请让管理员提供 `kms:ListAliases` 和 `kms:DescribeKey`。

## 选项 2：使用启用加密 AWS CDK
<a name="enable-encryption-cdk"></a>

要在 CDK 应用程序中使用 AWS 托管SNS 密钥，请添加以下片段：

```
import software.amazon.awscdk.services.sns.*;
import software.amazon.awscdk.services.kms.*;
import software.amazon.awscdk.core.*;

public class SnsEncryptionExample extends Stack {
    public SnsEncryptionExample(final Construct scope, final String id) {
        super(scope, id);

        // Define the managed SNS key
        IKey snsKey = Alias.fromAliasName(this, "helloKey", "alias/aws/sns");

        // Create the SNS Topic with encryption enabled
        Topic.Builder.create(this, "MyEncryptedTopic")
            .masterKey(snsKey)
            .build();
    }
}
```

## 附加信息
<a name="set-up-topic-with-sse"></a>
+ **自定义 KMS 密钥** - 如果需要，您可以指定自定义密钥。在 Amazon SNS 控制台中，从列表中选择自定义 KMS 密钥或输入 ARN。
+ **自定义 KMS 密钥的权限** - 如果使用自定义 KMS 密钥，请在密钥策略中包含以下内容，以使 Amazon SNS 能够加密和解密消息：

```
{ 
    "Effect": "Allow", 
    "Principal": { 
        "Service": "sns.amazonaws.com" 
     },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "ArnLike": { 
            "aws:SourceArn": "arn:aws:service:region:customer-account-id:resource-type/customer-resource-id" 
        },
        "StringEquals": { 
            "kms:EncryptionContext:aws:sns:topicArn": "arn:aws:sns:your_region:customer-account-id:your_sns_topic_name" 
        }
    }
}
```

## 对使用者的影响
<a name="enable-encryption-impact-on-consumers"></a>

启用 SSE 不会改变订阅者使用消息的方式。 AWS 透明地管理加密和解密。消息在静态状态下保持加密状态，并在发送给订阅用户之前自动解密。为了获得最佳安全性， AWS 建议为所有端点启用 HTTPS 来确保消息的安全传输。