调用MS Graph API上传证书失败,更新Azure AD注册应用证书报错
Azure AD应用续期证书MS Graph API调用解决方案
报错根因说明
你遇到的"key value cannot be null or empty"错误是因为构造keyCredentials参数时,key字段没有传入合法的证书公钥内容。这里的key字段与你查询现有证书返回的空值字段、OpenSSL读取的证书内置key属性无关联,是API要求传入的公钥编码值,需要自行从本地证书文件提取。
正确REST API调用步骤
步骤1:提取证书公钥的Base64编码
使用OpenSSL处理本地公钥证书(.cer/.pem格式),执行命令得到无换行的Base64编码串:openssl base64 -in your_cert.cer -A
注意:需要手动去掉输出结果前后的-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----标记,只保留中间的编码内容
步骤2:构造PATCH请求
请求地址:PATCH https://graph.microsoft.com/v1.0/applications/{目标应用的对象ID}
请求头必填参数:
- Authorization: Bearer {拥有Application.ReadWrite.All权限的访问令牌}
- Content-Type: application/json
请求体说明:
必须先调用GET接口拉取该应用现有
keyCredentials数组,将新证书配置追加到数组中再提交,否则会覆盖原有所有证书导致业务不可用
{ "keyCredentials": [ // 这里保留GET接口返回的所有原有证书配置 { "type": "AsymmetricX509Cert", "usage": "Verify", "key": "步骤1得到的Base64编码串", "displayName": "自定义证书名称", "startDateTime": "2024-01-01T00:00:00Z", "endDateTime": "2025-01-01T00:00:00Z", "keyId": "自行生成的GUID,用于标识该证书" } ] }
常用SDK调用示例(C# Microsoft Graph SDK v5)
- 初始化GraphServiceClient实例(已配置好身份认证)
- 读取证书并构造请求:
// 读取本地公钥证书字节 byte[] certBytes = File.ReadAllBytes("your_public_cert.cer"); // 构造新凭证对象 KeyCredential newCert = new KeyCredential { Type = "AsymmetricX509Cert", Usage = "Verify", Key = certBytes, DisplayName = "2024-2025业务续期证书", StartDateTime = new DateTimeOffset(2024,1,1,0,0,0,TimeSpan.Zero), EndDateTime = new DateTimeOffset(2025,1,1,0,0,0,TimeSpan.Zero), KeyId = Guid.NewGuid() }; // 拉取现有凭证,避免覆盖 var application = await graphClient.Applications["你的应用对象ID"].GetAsync(); var allKeyCreds = application.KeyCredentials.ToList(); allKeyCreds.Add(newCert); // 提交更新 await graphClient.Applications["你的应用对象ID"].PatchAsync(new Application { KeyCredentials = allKeyCreds });
注意事项
- keyId字段为自定义唯一标识,不需要从证书中读取,自行生成合法GUID即可
- 证书有效期必须和实际证书的生效、过期时间保持一致,否则会出现上传成功但无法使用的问题
- 如果需要同时删除过期证书,只需要在提交的keyCredentials数组中移除对应证书的配置项即可
内容的提问来源于stack exchange,提问作者Ayush Ujjwal
相关产品推荐
相关产品推荐

