Я занимаюсь разработкой простой службы Windows, отправляющей и получающей данные из удаленного веб-службы.
Я решил использовать класс WebClient для его простоты и усовершенствовал его, чтобы включить сертификат в запрос, например:
class MyWebClient : WebClient
{
public X509Certificate cert { set; get; }
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
req.ClientCertificates.Clear();
req.ClientCertificates.Add(cert);
return req;
}
}
Вот как я готовлю и делаю запросы:
try {
//...
string qry = "Some xml query...";
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors) { return true; };
X509Certificate cert = X509Certificate.CreateFromCertFile(appPath + @"\data\cert.der");
MyWebClient cl = new MyWebClient();
cl.cert = cert;
string xmlReq = qry;
cl.Headers[HttpRequestHeader.ContentType] = "text/xml";
var data = Encoding.UTF8.GetBytes(xmlReq);
byte[] res = cl.UploadData(apiUrl, data);
cl.Dispose();
string result = Encoding.UTF8.GetString(res);
} catch (Exception ex) {
//...
}
//...
Теперь я знаю, что загрузка сертификата из файла - не лучшая идея, но это не главное. Дело в том, что приведенный выше код прекрасно работает в настольном приложении, но выдает исключение «Не удалось установить безопасный канал для SSL / TLS» в службе Windows.
Я попытался установить службу под учетной записью «localService» и «networkService», и это не делает никаких различий.
ОБНОВЛЕНИЕ: установка под "пользователем" также не помогла.
Я что-то упустил?