You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Microsoft Graph订阅请求创建加密证书?——Microsoft Teams聊天订阅证书配置疑问

我之前在配置Microsoft Teams成员变更的Graph订阅时,也卡过encryptionCertificateencryptionCertificateId这两个参数的配置,正好可以给你梳理下具体操作步骤:

加密证书与ID的创建指引

首先明确两个参数的核心作用:

  • encryptionCertificateId:是你自定义的唯一标识(比如证书指纹或自定义GUID),用于让Graph服务识别你上传的证书
  • encryptionCertificate:是证书公钥内容的Base64编码字符串,用来加密通知中的资源数据

步骤1:生成证书(测试用自签名,生产用CA签发)

你可以用PowerShell或OpenSSL两种方式生成:

PowerShell方式

运行以下命令生成并导出证书文件:

# 生成符合要求的自签名证书
$cert = New-SelfSignedCertificate -Subject "CN=GraphSubscriptionCert" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
# 导出带私钥的PFX文件(后续用于解密Graph发送的加密通知)
Export-PfxCertificate -Cert $cert -FilePath "C:\temp\GraphCert.pfx" -Password (ConvertTo-SecureString "yourStrongPassword" -AsPlainText -Force)
# 导出公钥CER文件(用于Graph订阅配置)
Export-Certificate -Cert $cert -FilePath "C:\temp\GraphCert.cer"

OpenSSL方式

运行命令生成私钥和公钥证书文件:

openssl req -x509 -newkey rsa:2048 -sha256 -days 365 -nodes -keyout graph-key.pem -out graph-cert.pem -subj "/CN=GraphSubscriptionCert"

步骤2:将证书转换为Base64编码

需要提取证书的公钥内容,转换为无换行、无首尾标记的纯Base64字符串:

Windows(PowerShell)

# 读取证书文件原始内容
$certContent = Get-Content "C:\temp\GraphCert.cer" -Raw
# 移除证书首尾标记和多余换行符
$cleanContent = $certContent -replace "-----BEGIN CERTIFICATE-----", "" -replace "-----END CERTIFICATE-----", "" -replace "`r`n", ""
# 转换为符合要求的Base64字符串
$base64Cert = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($cleanContent))

Linux/macOS(OpenSSL)

这个命令会直接输出符合要求的纯Base64字符串:

openssl x509 -in graph-cert.pem -outform der | base64 -w 0

步骤3:设置encryptionCertificateId

推荐使用证书的**指纹(Thumbprint)**作为这个ID,天然保证唯一性:

PowerShell获取证书指纹

$cert.Thumbprint

OpenSSL获取证书指纹

openssl x509 -in graph-cert.pem -noout -fingerprint | cut -d "=" -f2 | tr -d ":"

你也可以手动生成一个GUID作为这个ID,只要确保在你的所有Graph订阅中唯一即可。

额外注意事项

  • 证书必须使用RSA算法,密钥长度≥2048位,哈希算法建议用SHA256及以上
  • 生产环境不要使用自签名证书,应使用受信任CA签发的正式证书
  • Graph订阅的expirationDateTime最长只能设置为3天,到期前需要手动续订订阅

内容的提问来源于stack exchange,提问作者dot

火山引擎 最新活动