如何为现有的 Amazon SES SMTP IAM 用户轮换访问密钥?

上次更新日期:2022 年 5 月 18 日

我想要在 AWS Identity and Access Management (IAM) 中轮换我的 Amazon Simple Email Service (Amazon SES) 简单邮件传输协议 (SMTP) 凭证。我该如何创建与 Amazon SES 兼容的用户名和密码?

解决方法

您在 IAM 控制台中为 SMTP 用户创建的访问密钥在客户连接到 SES API 端点时有效,但不能与 Amazon SES SMTP 接口配合使用。IAM 控制台中生成的密钥所采用的格式与 Amazon SES SMTP 服务器所需凭证的格式不同。

最佳实践是创建新的 Amazon SES SMTP 凭证,而不是转换现有私密访问密钥。 

要为 Amazon SES SMTP 接口设置凭证,请执行以下任意一项操作:

创建新的 Amazon SES SMTP 凭证(建议)

1.    使用 Amazon SES 控制台创建新的 Amazon SES SMTP 凭证

2.    在取得新的凭证以后,您可以删除 IAM 中的现有 Amazon SES 凭证(如果您不再需要它们)。

将您的现有秘密访问密钥转换成 Amazon SES SMTP 格式

注意:您必须通过以下步骤使用 Python 3 或更高版本。

1.    更新现有的 IAM 用户策略,以便在最低程度上赋予 ses: SendRawEmail 权限

2.    将以下 Python 代码粘贴到文本编辑器,然后将文件保存为 seskey.py

#!/usr/bin/env python3

导入 hmac
导入 hashlib
导入 base64
导入 argparse

SMTP_REGIONS = [
    'us-east-2',       # 美国东部(俄亥俄)
    'us-east-1',       # 美国东部(弗吉尼亚北部)
    'us-west-2',       # 美国西部(俄勒冈)
    'ap-south-1',      # 亚太地区(孟买)
    'ap-northeast-2',  # 亚太地区(首尔)
    'ap-southeast-1',  # 亚太地区(新加坡)
    'ap-southeast-2',  # 亚太地区(悉尼)
    'ap-northeast-1',  # 亚太地区(东京)
    'ca-central-1',    # 加拿大(中部)
    'eu-central-1',    # 欧洲(法兰克福)
    'eu-west-1',       # 欧洲(爱尔兰)
    'eu-west-2',       # 欧洲(伦敦)
    'sa-east-1',       # 南美洲(圣保罗)
    'us-gov-west-1',   # AWS GovCloud(美国)
]

# 需要这些值来验证签名。请勿更改它们。
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode('utf-8')


def main():
    parser = argparse.ArgumentParser(
        description='Convert a Secret Access Key for an IAM user to an SMTP password.')
    parser.add_argument(
        'secret', help='The Secret Access Key to convert.')
    parser.add_argument(
        'region',
        help='The AWS Region where the SMTP password will be used.',
        choices=SMTP_REGIONS)
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == '__main__':
    main()

3.    要运行 Python 脚本,请输入现有私密访问密钥。然后输入一个空格以及您在使用 SMTP 密码时所在的 AWS 区域。使用以下命令:

python3 seskey.py YOURKEYrrpg/JHpyvtStUVcAV9177EAKKmDP37P us-east-1

重要信息:请务必输入您的凭证,并在安全且受信任的计算机上运行此脚本。

4.    该脚本会输出可与 Amazon SES 一起使用的新的秘密访问密钥。将生成的 SMTP 凭证存储在应用程序中,然后使用这些凭证连接到 SES SMTP 端点


这篇文章对您有帮助吗?


您是否需要账单或技术支持?