如何从RESTFul请求中捕获客户端证书并在C#中针对服务器上的证书进行验证?

时间:2019-02-19 16:14:03

标签: c# ssl x509certificate2 asp.net-apicontroller

最近两个星期,我一直在研究这个主题,发现太多的信息使我不知所措。我将从头开始。我是一个新手,就像以前从未对证书做过任何事情一样。我创建了RESTful Web API,可以捕获邮递员的请求。在请求中,我正在发送CERT(my-cert.cer)。我想使用API​​控制器从请求中捕获CERT并验证服务器上的内容。甚至有可能以我的方式捕获CERT吗?我在任何地方都找不到很好的工作示例。请帮忙!

这是我的GET方法

public class clientController : ApiController
{
    public string Get(int id)
    {
        X509Certificate2 cert = Request.GetClientCertificate();
        X509Certificate2 cert2 = RequestContext.ClientCertificate;

        logger.addLine(LogLineType.Message, "CERT " + cert + "\n", "page", null);
        logger.addLine(LogLineType.Message, "CERT 2" + cert2 + "\n", "page", null);
        System.Console.WriteLine("cert : " + cert);
        System.Console.WriteLine("cert2 : " + cert2);

        GetClient getClient = new GetClient();
        string response = getClient.RetrieveClientRequest(id).ToString();
        return response; } }

1 个答案:

答案 0 :(得分:0)

根据MSDN

var cert = Request.GetClientCertificate();

将为您提供随请求发送的证书。
为了验证您现在有两个选择。

1)使用OCSP进行验证
2)致电

cert.Verify(); 

使用证书存储中的证书在本地验证它的链。 这意味着,它将在本地证书存储区中查找该证书或用于构建证书信任链的其他一些证书。

整个主题非常广泛。如果您的证书是由某个权威机构签名的,则存在一个链。 a标志b,b标志c和c标志您的证书(d)。通常,您有一个证书颁发机构(CA),用于对用户/计算机的证书请求进行签名。该CA的证书(大写字母通常是a或b)被部署到同一公司中的所有计算机。

使用Verify(),您可以查找证书本身,无论计算机是否知道证书。如果没有,那么您就上了链,一旦拥有了用于签名的树,您就会信任整棵树。

d由c签名=> d未知,但是存在c的签名。 c也不知道,但是签名告诉我们,它是由b签名的。 然后将b安装在计算机的受信任证书中,因此是已知的。因此,您信任b,这使您信任c,因此也信任d。

当然,这与撤销无关。我不确定,如果.Verify()将检查吊销列表。如果可用,最好使用OCSP。