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
Вот доказательство моего вывода...