Search code examples
httpsvb6

SecurityProtocolType.Tls12 in VB6


I want to establish a secure connection with my server which only supports TLS 1.2 and upwards.

I am adding the following line to my VB.NET applications to enable communication with my https server:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

However, I also still have some VB6 apps which also need to use https server.

And the above line is not available for VB6, and the code throws "Error Occurred in the Secure Channel Support". If I use it on http instead of https, it works fine.

How could I achieve the same for VB6?

Thank you!

Btw, this is my code:

Public Function GetHTTPResponse(Byval uSomeInput) As String

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 'required in order to use https!!!

    Dim nReq As Net.WebRequest = Net.WebRequest.Create("https://domain.xyz/answer.php")

    nReq.Method = "Post"
    nReq.ContentType = "application/x-www-form-urlencoded"

    Dim nReqStream As IO.Stream = nReq.GetRequestStream()

    Dim nASCIIEncoding As New System.Text.ASCIIEncoding

    Dim btPostData As Byte() = Nothing

    btPostData = nASCIIEncoding.GetBytes("&MyPHPInput=" & uSomeInput)
    nReqStream.Write(btPostData, 0, btPostData.Length)

    nReqStream.Close()

    Dim reader As New IO.StreamReader(nReq.GetResponse().GetResponseStream())
    Dim sRet As String = reader.ReadToEnd

    Return sRet

End Function

And this is the same code in VB6, but in VB6, I can't (to my knowledge) not set the Tls12 security protocol:

Public Function GetHTTPResponse(ByVal uSomeInput) As String

   'How do I set Tls12 protocol here??
   
    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")

    xmlhttp.Open "POST", "https://domain.xyz", False

    xmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" & VBA.Chr(10) & VBA.Chr(13)

    xmlhttp.Send pConvertStringToByte("https://domain.xyz/answer.php?MyPHPInput=" & uSomeInput)

    GetHTTPResponse = xmlhttp.responseText

End Function

Edit:

I have followed the advice to try using WinHttp.WinHttpRequest.5.1 instead as discussed here.

It seems to work, but for some reason, the variables are not being transferred / recognized by the script, while they were recognized with my old approach using MSXML2.ServerXMLHTTP.

This is my code:

Public Function GetHTTPResponse(ByVal uSomeInput) As String

    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")

    'force TLS 1.2
    xmlhttp.Option(9) = 2048
    xmlhttp.Option(6) = True

    xmlhttp.Open "POST", "https://domain.xyz", False

    xmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" & VBA.Chr(10) & VBA.Chr(13)

    xmlhttp.Send pConvertStringToByte("https://domain.xyz/answer.php?MyPHPInput=" & uSomeInput)

    GetHTTPResponse = xmlhttp.responseText

 End Function

Does anybody see why my old byte array is not accepted for "WinHttp.WinHttpRequest.5.1" while it work for "MSXML2.ServerXMLHTTP"?


Solution

  • Try this one:

    ' Define uSomeInput's data type, otherwise it's passed as a Variant, which might or might not be what we intended
    Public Function GetHTTPResponse(ByVal uSomeInput As String) As String
        
        
        ' Use early instead of late binding
        Dim xmlhttp As WinHttp.WinHttpRequest
        Set xmlhttp = New WinHttpRequest
    
        ' force TLS 1.2
        xmlhttp.Option(9) = 2048
        xmlhttp.Option(6) = True
    
        xmlhttp.Open "POST", "https://domain.xyz", False
    
        xmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" & vbNewLine
        ' Let the webserver know the size of the data
        xmlhttp.SetRequestHeader "Content-Length", CStr(LenB(uSomeInput)) & vbNewLine
    
        xmlhttp.Send pConvertStringToByte("https://domain.xyz/answer.php?MyPHPInput=" & uSomeInput)
    
        ' Not sure why the string to byte array conversion is necessary
        ' Could just try the string as well
        xmlhttp.Send "https://domain.xyz/answer.php?MyPHPInput=" & uSomeInput
    
        GetHTTPResponse = xmlhttp.ResponseText
    
     End Function
    

    If everything else fails and you require a VB6 solution and therefore are willing (or forced) to spend money ($ 395) on a commercial component, have a look at SocketTools. Although tempting, I suggest taking the Library over the ActiveX edition (which is just a wrapper of the former, IMHO). I've used SocketTools in VB6 with great success in the past (since its 6.x version, IIRC). I started using it, because I faced a very similar task to yours: I had to support SFTP transfer in my VB6 application.