0

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

我已经阅读了数百篇如何设置基础设施的复杂文章,但由于烦人的设置和非常复杂的部分(iE 证书存储设置,...),我感到很沮丧。我决定在我的服务方法中手动进行证书验证。这样我就知道发生了什么,我不必依赖复杂的服务器设置。

但问题是:我该怎么做?

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

[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 会阻止未知/未经验证的客户端证书。对于这种特殊的服务方法,我需要禁用此检查。

如果答案很简单并且已经回答了数千次,请不要怪我。关于这个主题的文章有数千篇,有 100 种不同的解决方案和变体。我找不到适合我的问题的匹配项。

4

0 回答 0