如何为Microsoft Graph订阅请求创建加密证书?——Microsoft Teams聊天订阅证书配置疑问
我之前在配置Microsoft Teams成员变更的Graph订阅时,也卡过encryptionCertificate和encryptionCertificateId这两个参数的配置,正好可以给你梳理下具体操作步骤:
加密证书与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




