[英]HttpWebRequest, TLS and application pool service identity
我們使用HttpWebRequest
對遠程服務器進行 web 服務調用。 該調用需要從本地計算機加載證書。
我們遇到的問題是,如果應用程序池標識設置為NetworkService
,那么調用將失敗,並在HttpWebResponse.GetResponse()
調用上出現通用 TLS/SSL 錯誤。 如果我們將應用程序池用戶的身份更改為LocalSystem
,則它可以正常運行。
我想弄清楚的是為什么。 LocalSystem
可以訪問哪些NetworkService
而不會影響 post call?
代碼非常簡單:
string URL = "https://mywebserver.net";
X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certResults = store.Certificates.Find(X509FindType.FindBySubjectName, "nameofthecertificate", false);
/* I have confirmed that the certificate is found regardless of
* how the application pool is configured.
*/
X509Certificate cert = certResults[0];
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.AllowAutoRedirect = true;
req.ClientCertificates.Add(cert);
req.Method = "POST";
req.ContentType = "application/soap+xml;charset=UTF-8";
StringBuilder postData = new StringBuilder();
postData.Append("some soap info");
byte[] postBytes = Encoding.UTF8.GetBytes(postData.ToString());
using (Stream postStream = req.GetRequestStream())
{
postStream.Write(postBytes, 0, postBytes.Length);
postStream.Flush();
postStream.Close();
}
// dies here when running under NetworkService
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
String data = String.Empty;
using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
{
data = reader.ReadToEnd();
reader.Close();
}
一般來說,應用程序池需要一個身份才能運行。 您可以配置身份使其像您一樣運行,但請記住,不同的身份具有不同級別的權限。
您的問題可能很簡單,因為應用程序池身份沒有使用它嘗試執行的代碼的權限。 您可以通過查看已部署的項目文件夾權限來查看。
既然您提到了 SSL/TLS 錯誤,我會認為該身份對已安裝的證書沒有權限。 打開mmc
並檢查Local Computer/Personal/Certificates
存儲中是否有證書。 如果這樣做,請右鍵單擊證書和 go 到All Tasks -> Manage Private Keys...
通過從您的計算機位置添加應用程序池標識來添加它:
IIS AppPool\YourNameOfAppPool
。
你不應該得到另一個對話框說它沒有找到你正確地添加了它。
在此處閱讀有關應用程序池標識的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.