本文档介绍了如何在 Gmail API 中使用 S/MIME 电子邮件证书。
Gmail API 提供程序化访问权限,用于管理 Google Workspace 网域中用户的 S/MIME 电子邮件证书。
管理员必须为网域启用托管 S/MIME,证书才能正常运行。
S/MIME 标准为 MIME 数据的公钥加密和签名提供了规范。在用户账号中配置 S/MIME 证书后,Gmail 会以以下方式使用这些证书:
使用用户证书和私钥对发出的邮件进行签名。
使用用户私钥解密收到的邮件。
使用收件人证书和公钥加密发出的邮件。
使用发件人证书和公钥验证收到的邮件。
您可以生成各个 S/MIME 证书,并使用 Gmail API 上传这些证书。每个 S/MIME 证书都适用于用户电子邮件账号的特定别名。别名包括主邮箱和自定义的“发件人”地址。该 API 会将单个 S/MIME 证书标记为每个别名的默认证书。
如需详细了解别名,请参阅使用 Gmail API 管理别名和签名。
授权 API 访问权限
如需授权访问 Gmail API,请使用以下方法之一:
使用需要最终用户同意的标准 OAuth 2.0 流程来获取 OAuth 2.0 访问令牌。如需了解详情,请参阅了解身份验证和授权。
如要使用此选项,网域管理员必须在 Google 管理控制台中选中为收发电子邮件启用 S/MIME 加密复选框。如需了解详情,请参阅在 Google 管理控制台中启用托管 S/MIME。
ACL 范围
Gmail API 依赖于与 Gmail sendAs 方法相同的 ACL 范围:
gmail.settings.basic:此范围是更新主要SendAsS/MIME 所必需的。gmail.settings.sharing:此范围是更新来自 S/MIME 的自定义所必需的。
配置 S/MIME 密钥
settings.sendAs.smimeInfo 资源提供了多种管理 S/MIME 证书的方法。每个证书都与用户的某个“发件人别名”相关联。
如需确定用户的“发件人别名”,请对 settings.sendAs 资源使用 settings.sendAs.list 方法。
上传 S/MIME 密钥
使用 settings.sendAs.smimeInfo 资源上的 settings.sendAs.smimeInfo.insert 方法,为属于用户的别名上传新的 S/MIME 密钥。使用以下路径参数标识目标别名:
userId:用户的电子邮件地址。使用特殊值me表示经过身份验证的用户。sendAsEmail:您要上传密钥的别名。此电子邮件地址会显示在使用相应别名发送的邮件的From:标头中。
S/MIME 证书和私钥应以该格式显示在 pkcs12 字段中;请求中不应设置任何其他字段。pkcs12 字段包含用户 S/MIME 密钥和签名证书链。API 会先对此字段执行标准验证,然后再接受该字段,并验证以下内容:
- 主题与指定的电子邮件地址匹配。
- 失效日期有效。
- 签发证书的证书授权机构 (CA) 位于 Google 的信任列表中。
- 证书符合 Gmail 的技术限制。
如果密钥已加密,密码应位于 encryptedKeyPassword 字段中。成功的 settings.sendAs.smimeInfo.insert 方法调用会返回 settings.sendAs.smimeInfo 资源 id,用于在将来引用相应密钥。
列出用户的 S/MIME 密钥
使用 settings.sendAs.smimeInfo 资源上的 settings.sendAs.smimeInfo.list 方法可返回指定别名对应的指定用户的 S/MIME 密钥列表。使用以下路径参数确定目标别名:
userId:用户的电子邮件地址。使用特殊值me表示经过身份验证的用户。sendAsEmail:要列出密钥的别名。此电子邮件地址会显示在使用相应别名发送的邮件的From:标头中。
检索别名的 S/MIME 密钥
使用 settings.sendAs.smimeInfo 资源上的 settings.sendAs.smimeInfo.get 方法可返回用户的特定“发件人别名”的特定 S/MIME 密钥。使用以下路径参数标识目标别名:
userId:用户的电子邮件地址。使用特殊值me表示经过身份验证的用户。sendAsEmail:您要检索密钥的别名。此电子邮件地址会显示在使用相应别名发送的邮件的From:标头中。
删除 S/MIME 密钥
使用 settings.sendAs.smimeInfo 资源中的 settings.sendAs.smimeInfo.delete 方法从别名中删除指定的 S/MIME 密钥。使用以下路径参数标识目标别名:
userId:用户的电子邮件地址。使用特殊值me表示经过身份验证的用户。sendAsEmail:您要删除密钥的别名。此电子邮件地址会显示在使用相应别名发送的邮件的From:标头中。id:smimeInfo的不可变 ID。
为别名设置默认 S/MIME 密钥
使用 settings.sendAs.smimeInfo 资源上的 settings.sendAs.smimeInfo.setDefault 方法将指定的 S/MIME 密钥标记为指定别名的默认密钥。使用以下路径参数确定目标别名:
userId:用户的电子邮件地址。使用特殊值me表示经过身份验证的用户。sendAsEmail:要将哪些别名的密钥设置为默认密钥。此电子邮件地址会显示在使用相应别名发送的邮件的From:标头中。id:smimeInfo的不可变 ID。
代码示例
以下代码示例展示了如何使用 Gmail API 管理具有多个用户的组织的 S/MIME 证书:
为 S/MIME 证书创建 smimeInfo 资源
此代码示例展示了如何从文件中读取证书、将其编码为 Base64网址 字符串,并将其分配给 settings.sendAs.smimeInfo 资源上的 pkcs12 字段:
Java
Python
上传 S/MIME 证书
如需上传证书,请调用 settings.sendAs.smimeInfo.insert 方法,并在请求正文中提供 settings.sendAs.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 文件中指定用户的证书:
证书管理
此示例结合使用了 settings.sendAs.smimeInfo 资源中的多种方法,展示了如何管理组织的证书。列出用户的证书。如果默认证书已过期或未设置,则上传指定文件中的证书。然后,它会将到期日期最远的证书设置为默认证书。
然后,此函数会处理 CSV 文件,类似于之前的从 CSV 文件插入证书示例。