首页 > 解决方案 > 在 C# 中使用具有客户端证书身份验证的 Web API

问题描述

我正在使用具有客户端证书身份验证的 Web api。我有两个 cert.pem,key.perm 文件。我通过在证书选项卡中导入这两个文件成功地在邮递员中测试了 api。它工作正常。但是当我尝试在我的 asp.net Web 应用程序中实现该 api 时,它显示身份验证失败错误。我不知道如何在编码的身份验证部分同时使用 cert.pem、key.perm 文件。

我尝试了一些编码。

 string url = "https://uat-api.ssg-wsg.sg/courses/runs/50331/sessions?uen=S89PB0005D&courseReferenceNumber=PA-S89PB0005D-01-Fuchun 354&sessionMonth=012021";

 ServicePointManager.Expect100Continue = true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                       | SecurityProtocolType.Tls11
                       | SecurityProtocolType.Tls12
                       | SecurityProtocolType.Ssl3;

  X509Certificate clientCertificate = X509Certificate.CreateFromCertFile(System.Web.HttpContext.Current.Server.MapPath("~/Certificates/cert.pem"));

  HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format(url));
  WebReq.Method = "GET";

  WebReq.ClientCertificates.Add(clientCertificate);
  HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
  
  using (Stream stream = WebResp.GetResponseStream())   
  {
           StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
           jsonString = reader.ReadToEnd();
  }

谁能帮助我如何在身份验证部分同时使用 cert.pem、key.perm 文件并使 api 成功运行.. 谢谢。

标签: asp.netasp.net-web-apissl-certificatex509certificatewebapi

解决方案


我假设您的 cert.pem 文件是证书,而 key.pem 文件包含私钥。如果您使用的是 .net 5,则可以执行以下操作:

var certificatePem = File.ReadAllText("cert.pem"); //you have to provide the correct path here
var key = File.RealAllText("key.pem"); //and here

var certificate = X509Certificate2.CreateFromPem(certificatePem, key);

请注意新 X509Certificate2 类的使用。

如果我最初的假设不正确,请将文本发布在 pem 文件中(当然,您可以删除部分文本,或者您可以将相关部分变灰)


推荐阅读