You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自签名X509Certificate2创建Microsoft Graph API订阅失败

解决Microsoft Graph订阅证书验证错误:Cannot find the requested object

1. 修正公钥的获取方式

Graph API要求EncryptionCertificate是DER编码的X.509证书完整Base64字符串,而非单纯的公钥字节。你当前用GetPublicKey()获取的内容不符合格式要求,需替换为证书原始数据的Base64:

// 替换原x509PublicKey的获取逻辑
var x509PublicKey = Convert.ToBase64String(selfSignedCertificate.RawData);

若使用PEM格式,需去除头尾标记和换行:

var pemCert = selfSignedCertificate.ExportCertificatePem();
var x509PublicKey = pemCert.Replace("-----BEGIN CERTIFICATE-----", "")
                           .Replace("-----END CERTIFICATE-----", "")
                           .Replace("\r", "")
                           .Replace("\n", "");

2. 确保EncryptionCertificateId是正确的证书指纹

EncryptionCertificateId必须为证书的SHA-1指纹,且需转为小写、去除空格:

var certificateId = selfSignedCertificate.Thumbprint.ToLower().Replace(" ", "");

禁止使用自定义字符串,必须与提交的公钥证书一一对应。

3. 修正证书的密钥用途配置

X509KeyUsageFlags.EncipherOnly的限制过于严格,Graph不支持该用途。需替换为KeyEncipherment(密钥加密):

// 替换原KeyUsage扩展代码
certificateRequest.CertificateExtensions.Add(
    new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, true));

推荐额外添加增强型密钥用法(EKU),明确证书用于加密场景:

certificateRequest.CertificateExtensions.Add(
    new X509EnhancedKeyUsageExtension(
        new OidCollection { new Oid("1.3.6.1.4.1.311.80.1") }, // 文档加密OID
        true));

4. 完整修正后的证书生成代码

using var rsa = RSA.Create(4096);

var certificateRequest = new CertificateRequest("CN=GraphSubscriptionCert", rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

// 配置正确的密钥用途
certificateRequest.CertificateExtensions.Add(
    new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, true));

// 添加增强型密钥用法(可选但推荐)
certificateRequest.CertificateExtensions.Add(
    new X509EnhancedKeyUsageExtension(
        new OidCollection { new Oid("1.3.6.1.4.1.311.80.1") },
        true));

var selfSignedCertificate = certificateRequest.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(1));

// 获取符合Graph要求的公钥
var x509PublicKey = Convert.ToBase64String(selfSignedCertificate.RawData);

// 获取正确的证书ID
var certificateId = selfSignedCertificate.Thumbprint.ToLower().Replace(" ", "");

// 导出私钥用于后续解密通知(需安全存储)
var rsaPrivateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());

5. 额外排查点

  • 检查证书有效期:确保NotBefore早于当前时间、NotAfter晚于当前时间
  • 确认应用权限:确保你的Graph应用拥有订阅目标资源的对应权限(如Mail.Read、Calendars.Read等)
  • 验证公钥有效性:将Base64字符串解码为DER文件,用系统证书查看器确认是合法的X.509证书

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:25:16