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

使用ClientCertificateCredential认证Azure应用报错:证书无私钥

Azure证书凭证认证报错:证书无私钥问题排查

问题场景

作为Azure新手,尝试通过证书凭证本地认证Azure注册应用,调用存储队列创建接口时失败。

代码实现

public async Task<QueueClient> GetQueueClientWithSdkWithCertificateCredentials(string storageAccountName, string queueName, string tenantId, string clientId, string certificateBase64Str)
{
    var certificateCredentials = new ClientCertificateCredential(tenantId, clientId, new X509Certificate2(Convert.FromBase64String(certificateBase64Str)));
    var queueClient = new QueueClient(new Uri($"https://{storageAccountName}.queue.core.windows.net/{queueName}"), certificateCredentials);
    var createQueueResponse = await queueClient.CreateAsync();
    if (createQueueResponse.IsError)
    {
        throw new Exception($"Error in creating queue: [{createQueueResponse}]");
    }
    return queueClient;
}

报错信息

Azure.Identity.AuthenticationFailedException: 'ClientCertificateCredential authentication failed: The certificate does not have a private key.

操作步骤

  • 使用openssl创建证书:
    .\openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 120 -nodes -subj "/C=XX/ST=MyDistrict/L=MyTown/O=MyCompany/OU=MyOrg/CN=MyCertificate"
    
  • 将cert.pem转为pfx文件,安装到Windows时勾选“导出私钥”,证书详情显示密钥图标;
  • 将证书安装至“受信任的根证书颁发机构”;
  • 上传cert.pem到Azure注册应用的“证书和机密”页面;
  • 从注册应用清单页面获取证书Base64值传入API。

问题原因

你传入代码的Base64字符串是从Azure应用注册清单中获取的公钥证书内容,该证书仅包含公钥,不包含私钥。而ClientCertificateCredential完成OAuth2客户端证书认证时,必须使用包含私钥的完整证书(PFX/P12格式),私钥用于生成签名供Azure验证身份。

解决步骤

  1. 生成包含私钥的PFX证书
    使用openssl将之前生成的私钥文件(key.pem)和公钥证书文件(cert.pem)合并为PFX格式,执行命令:

    openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem
    

    执行时会提示设置PFX文件的保护密码,请妥善保存该密码。

  2. 获取PFX证书的Base64字符串
    不要从Azure应用清单获取Base64,而是将本地生成的cert.pfx文件转换为Base64字符串。可以用PowerShell快速转换:

    [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\你的证书路径\cert.pfx"))
    
  3. 修改代码适配PFX证书
    在创建X509Certificate2实例时,传入PFX的Base64字符串和设置的密码(如果未设置密码则传null):

    // 替换为你的PFX密码,无密码则传null
    var certificate = new X509Certificate2(Convert.FromBase64String(certificateBase64Str), "你的PFX保护密码");
    var certificateCredentials = new ClientCertificateCredential(tenantId, clientId, certificate);
    
  4. 保留Azure端配置
    你之前上传到Azure应用注册的cert.pem(公钥证书)无需修改,Azure仅需要公钥来验证你用私钥生成的签名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:37