PowerShell - Comment utiliser la prise en charge de TLS 1.2

Pourquoi il est impératif d'implémenter le nouveau TLS dans son script?

Malheureusement, si vous souhaitez interagir avec eux en Powershell (dans une version inférieure à la 6.0) avec des commandes comme Invoke-RestMethod ou Invoke-WebRequest, vous risquez de vous retrouver avec l’erreur Could not create SSL/TLS secure channel.
Microsoft comme beaucoup d'autres sites sont en train de supprimer la prise en charge de TLS 1.0 et 1.1 sur l'ensemble de leur site pour imposer l'utilisation de TLS 1.2.
Donc pour que l'on s'évite l'erreur "Could not create SSL/TLS secure channel", il faudra forcer le TLS 1.2.

Forcer PowerShell à utiliser TLS 1.2

La solution consiste à forcer PowerShell à utiliser TLS 1.2 lorsqu'il négocie une connexion SMTP AUTH avec Exchange Online. Pour ce faire, il faut exécuter une commande permettant de sélectionner TLS 1.2 à l'aide de la classe ServicePointManager de DotNET.

Donc il suffira donc de rajouter cette ligne dans votre script pour que le problème ne se présente plus.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Exemple

C'est l'un de mes scripts qui me permet de me connecter à MSONLINE et Exchange Online sans droit d'administrateur.
#=============== Variable for use Root folder of PS1 ====================
If ($psISE)
{
    $currentScriptDirectory = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
}
If (!$currentScriptDirectory)
{
    If ($MyInvocation.MyCommand.CommandType -eq "ExternalScript")
    {
        $currentScriptDirectory = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
    }
    Else
    {
        $currentScriptDirectory = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0])
    }
}
#========================================================================
# Force the use of TLS 1.2 for Powershell
# Souce : https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12

# Check if your have administrator right
$p = New-Object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
   {
    Install-PackageProvider NuGet -Scope AllUsers -Force -Confirm:$false
    Install-Module -Name PowerShellGet -Force -Confirm:$false
   }     
else
   {
    # Get last Nuget on local user
    $sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
    $targetNugetExe = join-path -Path $currentScriptDirectory -ChildPath 'nuget.exe'
    if ((Test-Path $targetNugetExe) -eq $false){
    Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe
    }
    Set-Alias nuget $targetNugetExe -Scope Script -Verbose
   }

# 
if (($null -eq (Get-PSRepository -name PSGallery)) -or ((Get-PSRepository -name PSGallery).InstallationPolicy -ne 'Trusted')){
    if ($null -eq (Get-PSRepository -name PSGallery)) {
    Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted -SourceLocation 'https://www.powershellgallery.com/api/v2'
    }
    if ((Get-PSRepository -name PSGallery).InstallationPolicy -eq 'Trusted'){
    Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
    }
}

# Install the Azure AD Module
if ($null -eq (get-module MSOnline)){
    Install-module MSOnline -Scope CurrentUser -Force -Confirm:$false
}
else
{
    Import-Module MSOnline
}

if ($null -eq (get-module ExchangeOnlineManagement)){
    Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force -Confirm:$false
}
else
{
    Import-Module ExchangeOnlineManagement
}

$cred = Get-Credential

Connect-MsolService -Credential $cred
Connect-ExchangeOnline -Credential $cred

Commentaires

Posts les plus consultés de ce blog

Powershell - Supprimer Teams sur l'ensemble des profils utilisateurs

MRemoteNG - Voir les mots de passe dans l'application

Powershell - Comment tester les ports TCP ?