Gmail S/MIME API 提供程序化访问权限,可为 Google Workspace 网域中的用户管理 S/MIME 电子邮件证书。
管理员必须为网域启用 S/MIME,证书才能正常运行。
S/MIME 标准提供了 MIME 数据的公钥加密和签名规范。在用户账号中配置 S/MIME 证书会导致 Gmail 以以下方式使用该证书:
- Gmail 使用用户的证书和私钥对发出的邮件进行签名。
- Gmail 会使用用户的私钥解密收到的邮件。
- Gmail 会使用收件人的证书和公钥对发出的邮件进行加密。
- Gmail 会使用发件人的证书和公钥来验证收到的邮件。
您可以生成单独的 S/MIME 证书,并使用 API 将其上传。每个 S/MIME 证书都适用于用户电子邮件账号的特定别名。别名包括主电子邮件地址以及自定义“用以下地址发送电子邮件”地址。系统会为每个别名标记一个 S/MIME 证书作为默认证书。
授予 API 访问权限
授予对该 API 的访问权限的方式有两种:
- 您可以使用服务账号并为其授予全网域授权。如需了解这些术语的说明,请参阅身份验证和授权概览术语。如需了解如何启用此选项,请参阅创建具有全网域授权委派权限的服务账号
- 您可以使用标准 OAuth2 流程,要求最终用户同意才能获取 Oauth2 访问令牌。如需了解详情,请参阅身份验证和授权概览。如需使用此选项,网域管理员必须在网域控制台中选中“S/MIME API 最终用户访问权限已启用”复选框。
ACL 范围
此 API 依赖于与 Gmail sendAs 方法相同的 ACL 范围:
- gmail.settings.basic
- 更新主要的“用其他身份发送”S/MIME 时,必须使用此范围。
- gmail.settings.sharing
- 如需更新 S/MIME 中的自定义设置,必须具有此范围。
使用此 API
users.settings.sendAs.smimeInfo 资源提供了用于管理 S/MIME 证书的方法。每个证书都与用户的一个“以某人身份发送”别名相关联。
上传 S/MIME 密钥
使用 smimeInfo.insert() 方法为用户所属的别名上传新的 S/MIME 密钥。您可以使用以下参数来标识目标别名:
- userId
- 用户的电子邮件地址。您可以使用特殊值
me
来指明当前已通过身份验证的用户。 - sendAsEmail
- 要为其上传密钥的别名。这是使用此别名发送的邮件“发件人:”标头中显示的电子邮件地址。
S/MIME 证书和私钥应以该格式存在于 pkcs12
字段中;请求中不应设置任何其他字段。PKCS12 字段应同时包含用户 S/MIME 密钥和签名证书链。该 API 会先对此字段执行标准验证,然后再接受该字段,并验证以下内容:
- 主题与指定的电子邮件地址匹配。
- 到期时间有效。
- 颁发证书的证书授权机构 (CA) 已列入我们的可信名单。
- 证书符合 Gmail 的技术限制。
如果密钥已加密,则密码应位于 encryptedKeyPassword
字段中。成功的 insert() 调用将返回 smimeInfo 的 ID,该 ID 可用于日后引用密钥。
列出用户的 S/MIME 密钥
使用 smimeInfo.list() 方法返回给定别名对应的给定用户的 S/MIME 密钥列表。您可以使用以下参数来标识目标别名:
- userId
- 用户的电子邮件地址。您可以使用特殊值
me
来指明当前已通过身份验证的用户。 - sendAsEmail
- 要列出键的别名。这是使用此别名发送的邮件“发件人:”标头中显示的电子邮件地址。
检索别名的 S/MIME 密钥
使用 smimeInfo.get() 方法可返回用户的特定“以某人名义发送”别名的特定 S/MIME 密钥。您可以使用以下参数来标识目标别名:
- userId
- 用户的电子邮件地址。您可以使用特殊值
me
来指明当前已通过身份验证的用户。 - sendAsEmail
- 要检索其密钥的别名。这是使用此别名发送的邮件“发件人:”标头中显示的电子邮件地址。
删除 S/MIME 密钥
使用 smimeInfo.delete() 方法从别名中删除指定的 S/MIME 密钥。您可以使用以下参数来标识目标别名:
- userId
- 用户的电子邮件地址。您可以使用特殊值
me
来指明当前已通过身份验证的用户。 - sendAsEmail
- 要检索其密钥的别名。这是使用此别名发送的邮件“发件人:”标头中显示的电子邮件地址。
- id
- SmimeInfo 的不可变 ID。
为别名设置默认 S/MIME 密钥
使用 smimeInfo.setDefault() 方法将指定的 S/MIME 密钥标记为指定别名的默认密钥。您可以使用以下参数来标识目标别名:
- userId
- 用户的电子邮件地址。您可以使用特殊值
me
来指明当前已通过身份验证的用户。 - sendAsEmail
- 要检索其密钥的别名。这是使用此别名发送的邮件“发件人:”标头中显示的电子邮件地址。
- id
- SmimeInfo 的不可变 ID。
示例代码
以下代码示例演示了如何使用此 API 为包含多个用户的组织管理 S/MIME 证书。
为 S/MIME 证书创建 SmimeInfo 资源
以下代码示例演示了如何从文件中读取证书、将其编码为 base64url 字符串,并将其分配给 smimeInfo
资源的 pkcs12
字段:
Java
Python
上传 S/MIME 证书
如需上传证书,请调用 smimeInfo.insert
,并在请求正文中提供 smimeInfo
资源:
Java
Python
管理多位用户证书的示例
您可能希望一次性管理贵组织中多个用户的证书。以下示例展示了如何在一次批量调用中管理多位用户的证书。
插入 CSV 文件中的证书
假设您有一个 CSV 文件,其中列出了用户 ID 和每个用户证书的路径:
$ cat certificates.csv
user1@example.com,/path/to/user1_cert.p12,cert_password_1
user2@example.com,/path/to/user2_cert.p12,cert_password_2
user3@example.com,/path/to/user3_cert.p12,cert_password_3
Java
您可以使用之前的 createSmimeInfo
和 insertSmimeInfo
调用,按照 CSV 文件中指定的方式上传证书:
Python
您可以使用之前的 create_smime_info
和 insert_smime_info
调用,按照 CSV 文件中指定的方式上传证书:
证书管理
此示例结合了 smimeInfo
API 中的多个调用,以展示您可以如何管理贵组织的证书。它会列出用户的证书,如果默认证书已过期或未设置,则会上传在指定文件中找到的证书。然后,它会将到期时间最晚的证书设置为默认证书。
然后,从处理 CSV 文件的函数(如上例所示)调用此方法。