ASP.NET "Запрос был прерван: не удалось создать безопасный канал SSL/TLS" также происходит с настроенным servicepointmanager

Я пытаюсь запросить это изображение: https://www.kamerstunt.nl/file/img/web/woning/9577323WenumWieselZwolseweg-142d_6.jpg Если изображение больше не существует, когда вы читаете это, оно могло быть удалено, но вы все равно сможете просмотреть соответствующий SSL-сертификат. Используя мой браузер, я смог успешно перейти на страницу, запросить изображение и увидеть действительный сертификат SSL.

Я проверил здесь: запрос был прерван: не удалось создать безопасный канал SSL/TLS

Поэтому я добавил это решение в мой код:

Dim imgRequest As WebRequest = WebRequest.Create("https://www.kamerstunt.nl/file/img/web/woning/9577323WenumWieselZwolseweg-142d_6.jpg")
Dim imgResponse As WebResponse
ServicePointManager.Expect100Continue = True
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls 
'//I also tried: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3
imgResponse = imgRequest.GetResponse()
Dim streamPhoto As Stream = imgResponse.GetResponseStream()

Я старался:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12

Но тогда я получаю ошибки:'Tls12' is not a member of 'System.Net.SecurityProtocolType' а также 'Tls11' is not a member of 'System.Net.SecurityProtocolType'

Я также попытался изменить реестр, чтобы окна не блокировали DHE с 512 битами, и добавил ClientMinKeyBitLength со значением 0x00000200(512) в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman.

Но все равно не получается... почему?

1 ответ

Решение

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

Public Function GetRemoteStream(uRL As String) As MemoryStream
   Dim webClient As New WebClient()
   Dim imageBytes As Byte() = webClient.DownloadData(uRL)
   Dim mem As New MemoryStream(imageBytes)
   Return mem
End Function

Пример использования

 Dim nStream As New MemoryStream
 nStream = GetRemoteStream(yoururlhere)

РЕДАКТИРОВАТЬ, ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ********************************************

Изучив это и покопавшись немного дальше, я нашел решение. Похоже, что на сайте пропала поддержка SSL & Tls11.

Я начал новый проект, нацеленный на структуру 4.5. Я тогда использовал это SecurityProtocolType...

 SecurityProtocolType.Tls12

Решение

Измените целевую платформу на: 4.5 и используйте: SecurityProtocolType.Tls12. Теперь ваш протокол должен выглядеть так...

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

На другой ноте

Я рекомендую обернуть Streamтак что он правильно утилизируется. Например:

Using stream As Stream = imgResponse.GetResponseStream()
            Using ms As New MemoryStream()
                Dim count As Integer = 0
                Do
                    Dim buf As Byte() = New Byte(1023) {}
                    count = stream.Read(buf, 0, 1024)
                    ms.Write(buf, 0, count)
                Loop While stream.CanRead AndAlso count > 0
                'ms is your memory stream... as I take it you want the photo :)
            End Using
        End Using

Вот доказательство моего вывода...

введите описание изображения здесь

Другие вопросы по тегам