WebRequest + SSL + proxy (NTLM)
От: lexile  
Дата: 17.02.09 16:05
Оценка:
Собственно, что имеем: Vista, .NET Framework 3.5 SP1
Делаю запрос к некоторому ресурсу https://aaa.bbb.ccc/, используя WebRequest. Код примерно такой:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://aaa.bbb.ccc/ddd/");
request.ClientCertificates.Add(x509Certificate);
IWebProxy webProxy = WebRequest.DefaultWebProxy;
webProxy.Credentials = CredentialCache.DefaultCredentials;
request.Proxy = webProxy;
request.GetResponse().Close();

На выходе получаю 407 — Proxy authorization required. При том, что IE без проблем проходит через проксю и получает заветную страничку.
Если посмотреть пакетики, которые идут на прокси, то видно, что значение заголовка Proxy-Authorization отличатеся от такового, посылаемого експлорером.
Конвертим значения этих заголовков из Base64, получаем:
"NTLM <кракозябры><user><domain>" - значение заголовка из запроса браузера
"NTLM <кракозябры>" - значение заголовка из запроса WebRequest

Получается, что WebRequest пытается использовать пустые имя/домен. Прямое указание Credential'ов WebRequest'у (request.Proxy.Credentials = new CredentialCache(......)) и всякие другие шаманства не помогают, то же значение заголовка и, в итоге 407.
Собственно, есть KB Article со схожими симптомами: http://support.microsoft.com/kb/928563
В статейке написано:

Note This problem does not occur in the Microsoft .NET Framework 1.1.

Попробовал собрать под .NET 1.1, и действительно все заработало — WebRequest успешно получил заветную страничку.
Странно то, что этот фикс уже входит в сервис паки для .NET Framework, и, соответственно, у меня все должно работать.
Вопрос в том, сталкивался ли кто-нибудь с такой проблемой, и можно ли как-нибудь заставить это работать на фреймворке 2.0?
Любые идеи и предложения приветствуются
Re: WebRequest + SSL + proxy (NTLM)
От: lexile  
Дата: 17.02.09 16:22
Оценка:
Забыл уточнить, что приложение запускается от "правильного" юзера.

Внимательнее посмотрел KB Article, в ней указывается, что проблема связана с заголовком "Proxy-Connection: Keep-Alive". В моем же случае с ним все хорошо — он указывается во всех запросах...
Re[2]: WebRequest + SSL + proxy (NTLM)
От: lexile  
Дата: 17.02.09 16:28
Оценка:
Хотя вот это:

The client closes the connection to the proxy even if the proxy sends back the "Proxy-Connection: Keep-Alive" header for a CONNECT request.

в принципе, может быть причиной...
Re[3]: WebRequest + SSL + proxy (NTLM)
От: dushchak Украина  
Дата: 17.02.09 21:41
Оценка:
Здравствуйте, lexile, Вы писали:

L>Хотя вот это:

L>

L>The client closes the connection to the proxy even if the proxy sends back the "Proxy-Connection: Keep-Alive" header for a CONNECT request.

L>в принципе, может быть причиной...

Есть предположение — в статье в мсдне сказано

To use a certificate contained in the collection, the application must have the same access rights
as the entity that issued the certificate


Попробуй гарантировать доступ к сертификату

This command grants access to the private key of the "MyCertificate" certificate in the "My" certificate store for the TESTUSER account.

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER

... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: WebRequest + SSL + proxy (NTLM)
От: lexile  
Дата: 18.02.09 04:32
Оценка:
Здравствуйте, dushchak, Вы писали:

D>Попробуй гарантировать доступ к сертификату

D>

D>This command grants access to the private key of the "MyCertificate" certificate in the "My" certificate store for the TESTUSER account.

D>winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER


Сертификат уже находится в хранилище "My" юзера, от которого запускается приложение, соответственно, он имеет к нему полный доступ.
Re[5]: WebRequest + SSL + proxy (NTLM)
От: SergeyP Россия http://gadjievo.spb.ru
Дата: 16.07.09 12:48
Оценка:
Возникла такая же проблема. Весь инет перерыл, везде только вопросы и нет ответа.
Может быть, кто-нибудь уже докопался до истины?
return 0xDEAD;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.