Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure channel
At line:2 char:6
+     $r= Invoke-WebRequest  -Uri  $url -Headers $headers
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Solution:
1.Add Type 'ServerCertificateValidationCallback to define metod SkipCertificateCheck to skip certificate check.
```sh
if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
    {
		$certCallback = "
			using System;
			using System.Net;
			using System.Net.Security;
			using System.Security.Cryptography.X509Certificates;
			public class ServerCertificateValidationCallback
			{
				public static void SkipCertificateCheck()
				{
					if(ServicePointManager.ServerCertificateValidationCallback ==null)
					{
						ServicePointManager.ServerCertificateValidationCallback += 
							delegate
							(
								Object obj, 
								X509Certificate certificate, 
								X509Chain chain, 
								SslPolicyErrors errors
							)
							{
								return true;
							};
					}
				}
			}
		"
			Add-Type -TypeDefinition $certCallback -Language CSharp 
	}
```
2.Call SkipCertificateCheck() method before calling Invoke-WebRequest and Invoke-RestMethod commandlets in powershell.
```sh 
	[ServerCertificateValidationCallback]::SkipCertificateCheck()
    Invoke-WebRequest -Uri "https://www.nuget.org/" 
```
Problem:2 
 Note:  Don't set SecurityProtocol to Tls12 if using windows 10  and lower version of Windows 2016
```sh [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ```
If set SecurityProtocol as Tls12 then response of Invoke-WebRequest and Invoke-RestMethod commandlets will return below exception 
  Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
At line:2 char:6
+     $r= Invoke-WebRequest  -Uri  $url -Headers $headers
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
 
  
Due to PowerShell defaults, it’s not unusual to have issues with TLS. The ambiguous nature of this error did however make me jump to the conclusion that I probably just needed to enforce TLS 1.2. This can be done using this PowerShell one-liner but it doesn't solve problem ```sh [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ```
  Solution:
The resolution and solution for the problem is to allow TLS, TLS 1.1 and TLS 1.2.
  Insert the following line before invoking your PowerShell WebRequest using either Invoke-RestMethod or Invoke-WebRequest.
```sh [Net.ServicePointManager]::SecurityProtocol = = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12 ```
Solution:
Just close powershell IDE\window and reopen n then Powershell defaults will be restored then it will solve the problem 
  
 
 
No comments:
Post a Comment