使用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验证身份。
解决步骤
生成包含私钥的PFX证书
使用openssl将之前生成的私钥文件(key.pem)和公钥证书文件(cert.pem)合并为PFX格式,执行命令:openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem执行时会提示设置PFX文件的保护密码,请妥善保存该密码。
获取PFX证书的Base64字符串
不要从Azure应用清单获取Base64,而是将本地生成的cert.pfx文件转换为Base64字符串。可以用PowerShell快速转换:[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\你的证书路径\cert.pfx"))修改代码适配PFX证书
在创建X509Certificate2实例时,传入PFX的Base64字符串和设置的密码(如果未设置密码则传null):// 替换为你的PFX密码,无密码则传null var certificate = new X509Certificate2(Convert.FromBase64String(certificateBase64Str), "你的PFX保护密码"); var certificateCredentials = new ClientCertificateCredential(tenantId, clientId, certificate);保留Azure端配置
你之前上传到Azure应用注册的cert.pem(公钥证书)无需修改,Azure仅需要公钥来验证你用私钥生成的签名。
内容的提问来源于stack exchange,提问作者Veverke
相关产品推荐
相关产品推荐

