手动证书验证

时间:2012-10-28 23:19:46

标签: asp.net web-services asmx ssl-certificate x509certificate

我有一个ASP.net Webservice(asmx),它从我的应用程序返回一些安全的东西。我想创建一个客户端应用程序,它使用证书连接到此服务并调用此方法。使用证书我想确保只有这个特殊的客户端应用程序可以调用此webservice方法。

我已经阅读了数百篇复杂的文章如何设置基础设施,但我因为恼人的设置和非常复杂的部分(i.E.证书存储设置,...)而退出。我决定在我的服务方法中手动进行证书验证。这样我知道发生了什么,我不必依赖复杂的服务器设置。

但问题是:我怎么能这样做?

这个存根代表我想要做的事情:

[WebMethod]
public string GetSecureData() {
    if(!ValidateClientCertificate()) {
        throw new HttpException((int) (HttpStatusCode.BadRequest), "Bad Request");
    }
    return "i am secure";
}

private bool ValidateClientCertificate() {
    HttpClientCertificate cert = HttpContext.Current.Request.ClientCertificate;
    if (!cert.IsPresent || !HttpContext.Current.Request.IsSecureConnection) {
        return false;
    }

    bool isValid = /* is cert the almighty client certificate? */
    return isValid;
}

在客户端,我做了类似的事情:

X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\secure.cer");
ServicePointManager.CertificatePolicy = new CertPolicy();
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://myserver/Secure.asmx/GetSecureData");
Request.ClientCertificates.Add(Cert);
Request.Method = "GET";
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();

如果我可以将某种“公钥”放入应用程序(App_Data)并检查收到的客户端证书是否是该公钥所代表的证书,那将是非常棒的。

问题是:

  1. 如何在第一个代码段中显示为注释的魔法?
  2. 我猜IIS和ASP.net会阻止未知/未经验证的客户端证书。我需要对此特殊服务方法禁用此检查。
  3. 如果答案很简单且已经回答了数千次,请不要怪我。有关于此主题的数千篇文章有100种不同的解决方案和变体。我无法找到匹配的问题。

0 个答案:

没有答案