Как обнаружить запрос проверки подлинности сертификата клиента в HTTPWebRequest? - PullRequest
4 голосов
/ 15 февраля 2012

Я использую HTTPWebRequest для доступа к странице, на которой требуется сертификат клиента!

Я использую следующий код, и все работает!

    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text);

    X509Certificate2 userCert = SelectClientCertificate();
    if (userCert != null) myReq.ClientCertificates.Add(userCert);

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();

Теперь вот моя проблема, так как мой звонок SelectClientCertificate() показывает диалог, позволяющий пользователю выбрать сертификат, я не хочу показывать диалог, если сервер не запрашивает аутентификацию клиента! На самом деле я ищу бихевиоризм Internet Explorer. Если при доступе к странице, для которой серверу требуется аутентификация клиента клиента, вы получите диалоговое окно выбора сертификата, которое отображается иначе!

Я посмотрел на AuthenticationManager, но я не уверен, действительно ли мне нужно зарегистрировать свой собственный AuthenticationModule! так какой-нибудь намек на меня?

Я также проверил StatusCode для 403 или 403.7, но сервер, с которым я сейчас работаю, также вернет 200 в случае отсутствия сертификата, с содержанием, говорящим, что я не авторизован!

1 Ответ

0 голосов
/ 27 апреля 2012

Почему вы хотите проверить, что хочет сервер?Если запрос выполняется через https, просто запросите сертификат.

Если я хорошо помню, сервер никому не обязан ни за что.Обязанность клиента - начать общение с помощью SSL-рукопожатия, а клиент / сервер обмениваются своими сертификатами ПЕРЕД любой реальной HTTP-связью.Вы не можете определить, «требует» ли сервер от вас предоставления сертификата.Если вы попытаетесь поговорить с ним, и если вы не начнете с сертификата и если сервер хочет получить сертификат, сервер прервет соединение и будет молчать, или, возможно, вернет какой-нибудь случайный код ошибки.

Вы можете попытаться заранее определить, пытается ли сервер выполнить рукопожатие, прежде чем пытаться создать / отправить ему запрос, но вам придется сделать это на уровне ниже, на уровне TCP.Попробуйте проверить RFC, описывающие HTTPS-связь или возможность рукопожатий, может быть, это вам немного поможет.

Или просто попробуйте выполнить HTTP без S-запроса, а в случае неудачи повторите запрос с запросом сертификата и повторите попытку.с HTTPS.Я думаю, что ваши пользователи переживут это.

...