Visual Basic NET无法连接到TLS 1.2 Web服务器

时间:2020-06-16 20:56:12

标签: python visual-studio tls1.2

我需要使用Visual Basic NET连接到本地Web服务器。 Web服务器具有TLS 1.2。首先,我需要使用用户名和密码连接到页面,然后我需要从将要打开的页面中获取一些值。我知道服务器一切正常,因为我可以使用python脚本进行连接。因此,不起作用的Visual Basic代码是:

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 :(得分:0)

.Net具有一个名为“ useStrongCrypto”的设置,该设置允许客户端PC使用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

对于已安装的每个.NET Framework版本,都需要完成此操作。它们每个都应在最后一棵树中具有一个注册表项。不要忘记重启以使更改生效并首先备份注册表。

这里是更多信息:https://dougrathbone.com/blog/2016/02/28/pci-compliant-web-deploy-getting-webdeploy-working-after-disabling-insecure-ciphers-like-ssl-30-and-tls-10