HttpWebRequest, TLS и удостоверение службы пула приложений - PullRequest
0 голосов
/ 26 сентября 2019

Мы используем HttpWebRequest для выполнения вызовов веб-службы на удаленный сервер.Для вызова требуется загрузка сертификата с локального компьютера.

Проблема, с которой мы сталкиваемся, заключается в том, что если для идентификатора пула приложений установлено значение NetworkService, то вызов не выполняется с общей ошибкой TLS / SSL на сервере.HttpWebResponse.GetResponse() звонок.Если мы изменим личность пользователя пула приложений на LocalSystem, то он будет работать нормально.

Я пытаюсь выяснить, почему .Что LocalSystem имеет доступ к этому NetworkService, что не влияет на почтовый звонок?

Код довольно прост:

    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();
    }

1 Ответ

1 голос
/ 26 сентября 2019

Вообще говоря, пулу приложений требуется идентификатор для запуска.Вы можете настроить удостоверение так, чтобы оно работало так же, как и вы, но имейте в виду, что разные удостоверения имеют разные уровни разрешений.

Ваша проблема может быть такой же простой, как удостоверение пула приложений, не имеющее разрешений на использованиекод, который он пытается выполнить.Это можно проверить, просмотрев разрешения для папки развернутых проектов, чтобы увидеть.

Поскольку вы упомянули ошибки SSL / TLS, я бы подумал, что у удостоверения нет разрешения на установленный сертификат.Откройте mmc и проверьте, есть ли сертификат в магазине Local Computer/Personal/Certificates.Если вы это сделаете, щелкните правой кнопкой мыши по сертификату и перейдите на All Tasks -> Manage Private Keys....Добавьте идентификатор пула приложений, добавив его из местоположения вашего компьютера как:

IIS AppPool\YourNameOfAppPool.

Не должно появиться другое диалоговое окно, в котором говорится, что оно не было найдено, если вы добавили его правильно.

Подробнее об удостоверениях пула приложений здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...