我需要使用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)
感谢您的帮助。
答案 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版本,都需要完成此操作。它们每个都应在最后一棵树中具有一个注册表项。不要忘记重启以使更改生效并首先备份注册表。