Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24

Авторизация на сайте через сертификат

10.07.2017, 15:17. Показов 6312. Ответов 14

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Подскажите по следующем проблеме.

Имеется необходимость скачивай файлы с определенного ресурса - https:...
Пишу на Visual Studio 2013.
Использую метод myWebClient.DownloadFile, указываю URL и наименование файла.
Во время работы вылетает ошибка:
Необработанное исключение типа "System.Net.WebException" в System.dll
Дополнительные сведения: Запрос был прерван: Не удалось создать защищенный канал SSL/TLS.

Подскажите, как работать с сайтами, которые для аутентификации/авторизации используется сертификат?
Из документации указано что "аутентификации/авторизации с использованием “двустороннего” SSL."
Какие методы нужно использовать?

Добавлено через 2 часа 27 минут
Пробую следующим образом:

VB.NET
1
2
3
4
5
6
7
8
Dim xmlHttp As Object
Dim Sert As String = "HKEY_LOCAL_MACHINE\...."
Dim StCode As Integer
xmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1") 
xmlHttp.SetClientCertificate(Sert) 
xmlHttp.Open("GET", "https:...", False)
xmlHttp.Send()
StCode = xmlHttp.Status
Вылетает исключение "Значение не попадает в ожидаемый диапазон." на xmlHttp.SetClientCertificate(Sert)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2017, 15:17
Ответы с готовыми решениями:

Авторизация на сайте через Chrome
Привет. Цель программы Программа открывает Google Chrome, идет на сайт, вводит логин и пароль на сайте и кликает "войти". ...

Авторизация на сайте через post запрос
Всем доброго времени суток. Я новичок в vb net (учусь кодить) недавно мне пришлось работать с post get запросами. Так вот, есть...

Авторизация на сайте через POST запрос и последующая работа с этого аккаунта
Вот допустим я могу авторизироваться на сайте через ПОСТ запрос, а как мне сделать чтобы авторизироваться и например сделать другой запрос...

14
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
10.07.2017, 16:11
SSR2017, у класса HttpWebRequest есть свойство ClientCertificates куда нужно добавлять сертификат(ы). Класс WebClient внутри использует как раз HttpWebRequest, но не дает прямого доступа к нему. Нужно создать наследника от WebClient и переопределить метод GetWebRequest
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Class MyWebClient
    Inherits WebClient
 
    Protected Overrides Function GetWebRequest(address As Uri) As WebRequest
        Dim request As WebRequest = MyBase.GetWebRequest(address)
        If TypeOf request Is HttpWebRequest Then
            Dim httpRequest As HttpWebRequest = DirectCast(request, HttpWebRequest)
            Dim certificate As X509Certificate = ... ' Получаем сертификат
            httpRequest.ClientCertificates.Add(certificate)
        End If
        Return request
    End Function
End Class
Далее в коде везде используешь MyWebClient вместо WebClient.
3
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
10.07.2017, 16:42  [ТС]
OwenGlendower,
Спасибо за направление. Но дико извиняюсь т.к. не очень давно работаю с VB. Не все понимаю.
Т.е.
1) определяю переменную типа MyWebClient и вызываю функцию GetWebRequest
VB.NET
1
2
Dim req As MyWebClient
req.GetWebRequest("https...")
2) в вашем классе определяю путь до сертификата. Путь указывают в реестре
VB.NET
1
Dim certificate As X509Certificate = "HKEY_LOCAL_MACHINE..."
При таком задании, говорит данный тип не определен.
Что-то делаю не так.
Можете подробнее расписать?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
10.07.2017, 17:35
Цитата Сообщение от SSR2017 Посмотреть сообщение
При таком задании, говорит данный тип не определен.
Типы в .NET обычно принадлежат пространству имен (namespace) которое необходимо импортировать чтобы типы из него были видны в текущем контексте. Для этого используется команда Imports. Класс X509Certificate находится в пространстве имен System.Security.Cryptography.X509Certifi cates - открой документацию по ссылке чтобы уметь в будушем самостоятельно решать подобные "проблемы".

Цитата Сообщение от SSR2017 Посмотреть сообщение
Путь указывают в реестре
Так врядли получится. Скорее его нужно получать через класс X509Store. Как именно можно будет показать если будет известно где в certmgr он находится.

Цитата Сообщение от SSR2017 Посмотреть сообщение
определяю переменную типа MyWebClient и вызываю функцию GetWebRequest
1) Переменную недостаточно объявить. Нужно создать экземпляр с помошью New
VB.NET
1
Dim req As New MyWebClient
2) Метод GetWebRequest не нужно вызывать. Он вызывается автоматически. Тебе нужно как и раньше использовать метод DownloadFile
2
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
10.07.2017, 19:33
SSR2017, можно сделать так и никакой головной боли с сертификатами:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Friend Function GetPage(byVal url as String) as String
        ServicePointManager.ServerCertificateValidationCallback = Function(sender, certificate, chain, sslPolicyErrors) True
        
        Dim getReg As HttpWebRequest = WebRequest.Create(url)
        getReg.Method = "GET"
        getReg.ContentType = "text/html"
        getReg.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"
 
        Dim respPage As String = ""
        Dim postReqReader As StreamReader = Nothing
        Dim postresponse As HttpWebResponse = getReg.GetResponse()
        postReqReader = New StreamReader(postresponse.GetResponseStream, System.Text.Encoding.UTF8)
        respPage = postReqReader.ReadToEnd()
 
        postresponse.Close()
        postReqReader.Close()
        
    Return respPage
    End Function
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
10.07.2017, 19:42
Дядя Корней, твой пример подойдет для игнорирования ошибок с серверными сертификатами. Здесь же речь идет о клиентских.
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
11.07.2017, 10:24  [ТС]
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Типы в .NET обычно принадлежат пространству имен (namespace) которое необходимо импортировать чтобы типы из него были видны в текущем контексте. Для этого используется команда Imports. Класс X509Certificate находится в пространстве имен System.Security.Cryptography.X509Certifi cates - открой документацию по ссылке чтобы уметь в будушем самостоятельно решать подобные "проблемы".
Да, глупая ошибка. не увидел, что класс X509Certificate принадлежит пространству имен System.Security.Cryptography.X509Certifi cates

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Так врядли получится. Скорее его нужно получать через класс X509Store. Как именно можно будет показать если будет известно где в certmgr он находится.
Пока попробую так:
VB.NET
1
2
Dim cert As String = "d:\123.cer"
 Dim certificate As New X509Certificate(cert)
Пока ошибок не возникает

Цитата Сообщение от OwenGlendower Посмотреть сообщение
2) Метод GetWebRequest не нужно вызывать. Он вызывается автоматически. Тебе нужно как и раньше использовать метод DownloadFile
Описываю следующим образом:
VB.NET
1
2
 Dim req As New MyWebClient
 req.DownloadFile()
Ошибка: Не удалось разрешить перегрузку, так как данное число аргументов не подходит ни одному из доступных "DownloadFile".
Если честно по данной теме не очень прибавилось понимания.
Если вызываю метод DownloadFile программа сама понимаю как передать запрос методом GET или POST? или в данном случае не имеется значения?
Может посоветуете что почитать по данной тематики и с общем по VB?

Так же приложил проект весь проект. Возможно так будет проще.
Вложения
Тип файла: zip DownloadSignal.zip (94.4 Кб, 10434 просмотров)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
11.07.2017, 11:01
Лучший ответ Сообщение было отмечено SSR2017 как решение

Решение

Цитата Сообщение от SSR2017 Посмотреть сообщение
Ошибка: Не удалось разрешить перегрузку, так как данное число аргументов не подходит ни одному из доступных "DownloadFile".
Методу DownloadFile нужно передать аргументы - http ссылку и полное имя файла для сохранения.

Цитата Сообщение от SSR2017 Посмотреть сообщение
Если вызываю метод DownloadFile программа сама понимаю как передать запрос методом GET или POST? или в данном случае не имеется значения?
Метод DownloadFile использует GET метод. Это написано в документации по ссылке данной выше
This method uses the RETR command to download an FTP resource. For an HTTP resource, the GET method is used.
Разница между GET и POST важна. И если сайт требует использования POST, то вместо DownloadFile следует использовать один из UploadXYZ методов.

Цитата Сообщение от SSR2017 Посмотреть сообщение
Может посоветуете что почитать по данной тематики и с общем по VB?
По этой теме смотри документацию по классу WebClient, а по VB.NET есть прикрепленная тема со списком литературы Литература и ресурсы по Visual Basic .NET
1
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
11.07.2017, 15:31  [ТС]
OwenGlendower, огромное спасибо за помощь. Все отработало.
Но возникла другая ситуация.
После того как произошло чтение ключа, появляется новое окно о чтении ключевой информации, где нужно нажать ОК.
Метод SendKeys.Send (Пространство имен:System.Windows.Forms), я так понимаю использовать не могу т.к. у меня консольное приложение.
Пробую через My.Computer.Keyboard.SendKeys("{ENTER}") (Пространство имен: Microsoft.VisualBasic.Devices)
Но возникает ошибка " SendKeys не может выполняться в рамках этого приложения, так как приложение не обрабатывает сообщения Windows. Измените приложение, так чтобы оно обрабатывало сообщения, или используйте метод SendKeys.SendWait."
Получается нужно передать фокус на новое окно, но оно уже и так активно, Как правильно передать новому окну нажатие клавиши?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
11.07.2017, 15:35
Цитата Сообщение от SSR2017 Посмотреть сообщение
После того как произошло чтение ключа, появляется новое окно о чтении ключевой информации, где нужно нажать ОК.
Какое именно окно? (лучше в виде скриншота).
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
11.07.2017, 15:51  [ТС]
OwenGlendower,
Скрин приложил.
Там может быть два варианта, или одно окно, или последовательность двух окон.
Миниатюры
Авторизация на сайте через сертификат  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
11.07.2017, 16:10
SSR2017, думаю эти окна не получится убрать
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
11.07.2017, 17:30  [ТС]
OwenGlendower, разве нельзя активировать эти окна и просто передать нажатие клавиши Enter?

Добавлено через 1 час 17 минут
OwenGlendower, еще раз огромное спасибо!!!
Как исключить одно окно понят.
Осталось понято как исключить другое.
0
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
11.07.2017, 17:40
SSR2017, Как вариант попробовать использовать FindWindow и PostMessage
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 24
12.07.2017, 10:37  [ТС]
Всем огромное спасибо. Разобрался!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2017, 10:37
Помогаю со студенческими работами здесь

Авторизация на сайте через соцсети (API, OAuth)
Помогите.

Авторизация на сайте через программу
вот есть форма на которой есть два поля 1)e-mail 2) пароль и кнопка вход. Мне нужно чтобы при нажатии на кнопку войти в программе я вошел...

Авторизация на сайте через IdHTTP
Здравствуйте! Не могу понять собственно в чём дело - не проходить авторизация. Прочитал много похожих тем на форуме и никак не найду...

Авторизация через парсер на сайте
Авторизация Через парсер на сайте это возможно или я ерундой занимаюсь ??? package com.company; import org.jsoup.Jsoup; ...

Авторизация на сайте через приложение
Добрый день! Подскажите, пожалуйста, как реализовать вход на сайт через приложение. Пробовал через NSURLRequest, но, я так понимаю, это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru