我有一个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)并检查收到的客户端证书是否是该公钥所代表的证书,那将是非常棒的。
问题是:
如果答案很简单且已经回答了数千次,请不要怪我。有关于此主题的数千篇文章有100种不同的解决方案和变体。我无法找到匹配的问题。