tail -f /dev/null

If you haven't had any obstacles lately, you're not challenging. be the worst.

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.

環境

  • Windows server 2016
  • Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe
  • PSVersion: 5.1.14393.3471
  • PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.14393.3471
  • BuildVersion: 10.0.14393.3471
  • CLRVersion: 4.0.30319.42000
  • PSRemotingProtocolVersion: 2.3

事象

Invoke-WebRequest の実行に関して, Local 端末では問題無いが Windows Server 2016 上で実行すると次の error が発生した.

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

PowerShell 利用時に default で TLS1.0 を利用しようとして error となっている.

error が曖昧過ぎる...

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Exception calling "DownloadString" with "1" argument(s): "The request was aborted: Could not create SSL/TLS secure channel."

上記のように chocolatey を download しようとした際には若干分かりやすい exception が吐かれる.

対応

TLS 関連で問題が発生することは珍しく無く, 一先ず TLS1.2 を強制することで解決するかどうか見る.

上記は TLS1.2 を利用することで解決した.

# Default TLS 1.0 and will be caught security error so use 1.2 temporary.
Set-ExecutionPolicy Bypass -Scope Process -Force
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

### or

# Default PowerShell TLS 1.0 and will be caught security error so make use 1.2 permanently.
# https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/15150051-add-support-for-tls-1-2-invoke-webrequest-invoke
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\ -Name SchUseStrongCrypto -Value 1

一時的か永続的に (Server 側に) 設定するかは設計方針による.