Force PowerShell to use newer TLS versions

The PowerShell Gallery has deprecated Transport Layer Security (TLS) versions 1.0 and 1.1 as of April 2020 for security reasons causing an incompatibility with module Cmdlets:

PS C:\WINDOWS\system32> Install-Module -Name PSEventViewer -Scope User -Force
WARNING: Source Location ‘https://www.powershellgallery.com/api/v2/package/PSEventViewer/1.0.13' is not valid.
PackageManagement\Install-Package : Package ‘PSEventViewer' failed to download.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1772 char:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (C:\Users\adm_jz…entViewer.nupkg:String) [Install-Package], Exception
    + FullyQualifiedErrorId : PackageFailedInstallOrDownload,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

To work around this run:

[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
Install-Module PowerShellGet -RequiredVersion 2.2.4 -SkipPublisherCheck

It should be noted this only affects legacy PowerShell 5.1 and earlier. PowerShell 6-7 don’t utilize System.Net.ServicePointManager under the hood anymore and the replacement libraries it does use all default to having TLS1.2 enabled as far as I’ve tested. Web cmdlets like Invoke-RestMethod and Invoke-WebRequest also have dedicated parameters like -SslProtocol and -SkipCertificateCheck so you don’t have to resort to old hacky workarounds for things like disabling cert validation.

To force all processes targeting .NET 4.5 (including PowerShell) to use newer TLS versions and disable older versions, run:

Set-ItemProperty `
    -Path "HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319" `
    -Name "SchUseStrongCrypto" `
    -Value "1" `
    -Type DWord `
    -Force

Set-ItemProperty `
    -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319" `
    -Name "SchUseStrongCrypto" `
    -Value "1" `
    -Type DWord `

References: