How to handle HttpWebRequest C# with Tls 1.3 - ssl

I am unable to connect to an HTTPS server (TLS 1.3) using WebRequest because of this error message:
The request was aborted: Could not create SSL/TLS secure channel.
The previous TLS version was 1.2 and with below code I could GET the page properly but as the page ssl upgraded to TLS 1.3 I got the error and also I cannot find any solution about it:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
In fact, I think it should be something like below:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
but there is not.

It looks like TLS13 is supported now as part of the 4.8 .Net Framework
https://learn.microsoft.com/en-us/dotnet/api/system.net.securityprotocoltype?view=netframework-4.8
However it is only supported on newer Window's OS versions (windows 11 and server 2022+), see here for full support details.

Related

How to change TLS version from 1.1 to 1.2 in SOAP UI

UPDATED -
I have almost tried everything so that my TLS version can be changed to 1.2 from 1.1. However, whenever I check for version under preference in SOAP UI, it only shows two values, 1.1 and 1.0. I have tried the below things that were mostly accepted by people who had faced similar issue. I am currently using 5.4.0 version of SOAP UI
-Ddeployment.security.TLSv1.2=true
-Dsoapui.https.protocols=TLSv1.2
I have added the above line under SOAP's vmOption file and under the batch file as well. But it didn't worked. I still am getting https response as TLS 1.1 status.
Does anyone know how my SOAP UI version can be changed to TLS 1.2?
Thanks in advance
The following parameter must be added to the soapUI vmoptions file in soapUI's bin directory:
-Dsoapui.https.protocols=TLSv1.2

SSL connection via Domino managed bean to payment gateway fails with 'handshake_failure'

I have a Java agent that connects to a payment gateway to validate a CC transaction.
Everything seems to work fine when the Java logic is run on my IBM Notes client (9.0.1FP10IF3).
I am now migrating the logic to a managed bean on my Domino server (9.0.1FP6).
Whenever the connection is made through the bean, I observe the following error on the server console...
HTTP JVM: javax.net.ssl.SSLHandshakeException: Received fatal alert:
handshake_failure
I am certain it's because the payment gateway with which I am attempting to communicate has recently upgraded to enforce mandatory TLS 1.2 communications.
However, I'm not sure how to enforce those communications on the Domino server side?
I have set the recommended NOTES.INI variables...
DISABLE_SSLV3=1
SSL_DISABLE_TLS_10=1
... and set the 'SSLCipherSpec', but nothing is working.
Here is an excerpt from the logic I'm using to test everything out.
The 'DataOutputStream' line is what triggers the error...
URL url = new URL("https://host/endpoint");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setAllowUserInteraction(false);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-type", "text/xml");
connection.setRequestProperty("Content-length", Integer.toString(postContent.length()));
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes(postContent);
out.flush();
out.close();
connection.disconnect();
Any advice/assistance would be most appreciated!
As Per answered, this document allowed me to resolve the issue straight away...
www-01.ibm.com/support/docview.wss?uid=swg21985289

Sage Pay posting exception

I have strange issue when i post to sage pay from my vb.net application
objHttpRequest = HttpWebRequest.Create(objUri)
objHttpRequest.KeepAlive = False
objHttpRequest.Method = "POST"
objHttpRequest.ProtocolVersion = HttpVersion.Version10
objHttpRequest.ContentType = "application/x-www-form-urlencoded"
arrRequest = objUTFEncode.GetBytes(postValues)
objHttpRequest.ContentLength = arrRequest.Length
objStreamReq = objHttpRequest.GetRequestStream()
objStreamReq.Write(arrRequest, 0, arrRequest.Length)
objStreamReq.Close()
objStreamReq = objHttpRequest.GetRequestStream()
At this line exception is thrown as "The underlying connection was closed: An unexpected error occurred on a send".
When i debug, the connection object is nothing. But i dont know whether it was there before.
It was successfully posted before and i didnt change anything.
I copied the inputs and posted to sage pay with POSTMAN and it succeeds.
Can somebody help me to find this please.
Are you using the test server? TLS 1.0 and 1.1 were disabled on it last month so any connections other than TLS 1.2 will fail in that way. The live servers still support 1.0/1.1 until March 31st 2018, so you will need to ensure the client supports TLS 1.2.
You can use TLS 1.2 on .NET 4.0 IF the OS has .NET 4.5+ installed and you manually set the protocol:
https://blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support/

Cannot create SSL/TLS connection in vb when trying to obtain IPv4 address

I am writing a program in my computer science class and I have come across an error when trying to obtain the public IPv4 address of the computer.
This is my code:
Private Function GetMyIP() As Net.IPAddress
Using wc As New Net.WebClient
Return Net.IPAddress.Parse(Encoding.ASCII.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php")))
End Using
End Function
This is then called using this code:
tboxPublicIPv4.Text = GetMyIP().ToString
However, when it tries to write the IPv4 address to the textbox I get this error:
An unhandled exception of type 'System.Net.WebException' occurred in System.dll
Additional information: The request was aborted: Could not create SSL/TLS secure channel.
Any help would be appreciated. Thank you.
The URL you're calling is redirecting to https, and it seems at least TLS 1.1 is required.
You can enable TLS 1.1 or TLS 1.2 for Net.WebClient by setting the security-protocol with ServicePointManager.SecurityProtocol.
Furthermore you can use DownloadString instead of converting the downloaded data to a string.
I would also wrap it inside a Try/Catch.
Function GetMyIP() As Net.IPAddress
Using wc As New Net.WebClient
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Try
Return Net.IPAddress.Parse(wc.DownloadString("https://tools.feron.it/php/ip.php"))
Catch ex As Exception
Return New Net.IPAddress(0)
End Try
End Using
End Function
.NET 4.0 supports up to TLS 1.0 while .NET 4.5 or higher
supports up to TLS 1.2 For reference:
Default SecurityProtocol in .NET 4.5
Are there .NET implementation of TLS 1.2?

WinHttp errors on option 9 / Win2008 / Classic ASP

The Server I am connecting to requires TLS 1.1. My attempts fail. I am on a Windows Server 2008 R2 Standard SP1 64bit machine using Classic ASP.
Here is my code:
const WinHttpRequestOption_SecureProtocols = 9
const SecureProtocol_TLS1_1 = 512
dim objHTTP
set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
No error:
objHTTP.Option(9) = 128
'No error:
objHTTP.Option(9) = &H80
'Errors right here:
objHTTP.Option(WinHttpRequestOption_SecureProtocols) = SecureProtocol_TLS1_1
'Errors right here:
objHTTP.Option(9) = 512
'Errors right here:
objHTTP.Option(9) = &H200
It does not matter where in the code I place this line, I still get this error as it tries to execute:
Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument: 'Option'
My Server's Browser was IE8, so I installed IE11 hoping for better results. Same error.
I have the Internet options of IE11 set to
(Unchecked) Use SSL 2.0
(Unchecked) Use SSL 3.0
(Unchecked) Use TLS 1.0
(Checked) Use TLS 1.1
(Checked) Use TLS 1.2
In the Registry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\
I have TLS 1.1 and 1.2 set at enabled=1 and DisabledByDefault=0
All the rest are set opposite.
I did the same at /ControlSet001/ and /ControlSet002/
Why can't I set objHTTP.Option(9) = 512?
Bonus question: Why is WinHttp insisting on TLS 1.0 regardless of my Server's settings?
This option means TLS 1.0:
objHTTP.Option(9) = 128
And winhttp.dll library on Windows 2008 R2 has reference only to this value.
That's why you don't have any error with it.
Next option means TLS 1.1:
objHTTP.Option(9) = 512
But only Windows 2012 and newer knows this value.
That's why you have errors on Windows 2008 R2
So you have to upgrade your Windows in order to use this setting.
Or there is another approach using registry fix exists.
Because Windows uses this value in case it is not specified in your code.
This approach works without changing any line of code.
In general:
Register protocol TLS 1.1 or even 1.2 is better (or both) in next section
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
Tell winhttp.dll to use one of those protocols by default with value "DefaultSecureProtocols" in next sections
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
See more details in my answer here:
Classic ASP Outbound TLS 1.2
If you open the winhttp.dll in visual studio object browser, the version in Windows Server 2008 does not contain the constants for TLS1.1 and TLS1.2 under WinHttpRequestSecureProtocols enum.
If you do the same for Windows Server 2012, you'll find that the constants for TLS1.1 and TLS1.2 do appear.
I don't see an update available for Win 2008 to upgrade winhttp. If one exists I'd like to know. I haven't tried copying the Win 2012 version to Win 2008. I don't know if that would cause issues or not.