Visual Basi c NET не может подключиться к веб-серверу TLS 1.2 - PullRequest
1 голос
/ 16 июня 2020

Мне нужно подключиться к локальному веб-серверу с помощью Visual Basi c NET. Веб-сервер имеет TLS 1.2. Сначала мне нужно подключиться к странице с именем пользователя и паролем, а затем мне нужно взять некоторые значения со страницы, которая будет открыта. Я знаю, что с сервером все в порядке, потому что могу подключиться со скриптом python. Итак, код Visual Basi c, который не работает:

Imports System.Net
Imports System.Net.Http
Imports Newtonsoft.Json


Public Class Main

    Dim Red As Integer

    Private Shared ReadOnly client As HttpClient
    Public Function AcceptAllCertificates(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

    Shared Sub New()
        client = New HttpClient()
    End Sub

    Private Function GetSessionID() As String
        Dim form As MultipartFormDataContent = New MultipartFormDataContent()
        form.Add(New StringContent("Login"), "login")
        form.Add(New StringContent("Username"), "user")
        form.Add(New StringContent("Pasword"), "pwd")

        Try
            Dim response As HttpResponseMessage = client.PostAsync("main.app", form).Result

            Dim content As String = response.Headers.GetValues("Set-Cookie").FirstOrDefault()
            Dim parts() As String = content.Split(";")
            Dim value As String = parts(0)

            If value.Substring(0, 9) = "SessionId" Then
                Return value.Substring(10)
            End If
        Catch exception As Exception

        End Try

        Throw New Exception("Can't find the session ID")
    End Function

    Private Function GetTimeStamp() As Integer
        Return DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1)).TotalSeconds()
    End Function

    Private Sub GetValue(ByVal sessionID As String)
        Dim response As HttpResponseMessage = client.GetAsync("ajax.app?SessionId=" & sessionID & "&service=getDp&plantItemId=00000&_=" & GetTimeStamp()).Result

        Dim data = JsonConvert.DeserializeAnonymousType(response.Content.ReadAsStringAsync().Result, New With {Key .value = "", .unit = ""})

        Text1.Text = data.value & " " & data.unit
    End Sub

    Private Sub Connect_Click(sender As Object, e As EventArgs) Handles Connect.Click
        Try
            Dim sessionID As String = GetSessionID()

            txtSessionID.Text = sessionID
            GetTemperature(sessionID)
        Catch exception As Exception
            MessageBox.Show(exception.ToString())
        End Try
    End Sub

    Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertificates

        'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
        System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

        client.BaseAddress = New Uri("https://xxx.xxx.xxx.xxx/)

    End Sub

И код Python, который работает:

import requests

urllib3 = requests.urllib3 
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

session = requests.session()
session.verify=False

response = session.get('https://xxx.xxx.xxx.xxx/main.app?user=Username&pwd=Password')
response = session.get('https://xxx.xxx.xxx.xxx/ajax.app?service=getDp&plantItemId=00000&_=')

print(response.text)

Спасибо за помощь.

1 Ответ

0 голосов
/ 17 июня 2020

. Net имеет параметр под названием «useStrongCrypto», который позволяет клиенту P C использовать TLS 1.1 и выше. По умолчанию он отключен по какой-то неприятной причине.

Чтобы ваш локальный клиент мог использовать TLS 1.1 и выше (или, как Microsoft называет это «сильным шифрованием»), вам необходимо отредактировать следующие записи реестра: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 \ SchUseStrongCrypto = 00000001 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 \ SchUseStrongCrypto = 00000001

Это необходимо для каждой версии. * Рамка, которую вы установили. Каждый из них должен иметь запись в реестре в последнем дереве. Не забудьте перезагрузить компьютер, чтобы изменения вступили в силу, и сначала сделайте резервную копию реестра.

Дополнительная информация: https://dougrathbone.com/blog/2016/02/28/pci-compliant-web-deploy-getting-webdeploy-working-after-disabling-insecure-ciphers-like-ssl-30-and-tls-10

...