26
27

More than 5 years have passed since last update.

PowerShell で GitHub に wget(Invoke-WebRequest) できない場合の対処方法

Posted at

久しぶりに PowerShell で wget(Invoke-WebRequest) を使ったら、下記エラーが発生して目的のファイルを取得できませんでした。
※下記では Ruby 2.5.0 を取得しようとしています

> wget https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.0-1/rubyinstaller-2.5.0-1-x64.7z -OutFile rubyinstaller-2.5.0-1-x64.7z
wget : 要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした
発生場所 :1 文字:1
+ wget https://github.com/oneclick/rubyinstaller2/releases/download/rub ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

どうやら 2018/02/23 04:00 JST から GitHub が TLS 1.2 のみサポートするようになった とのことで、 PowerShell のデフォルト設定では TLS 1.2 には対応しておらず、エラーとなっていました。

対処方法

PowerShell を起動し、下記手順を実施して TLS 1.2 を有効化すると、 GitHub に wget できるようになりました。

  1. PowerShell で有効になっている暗号化形式を確認します

    > [Net.ServicePointManager]::SecurityProtocol
    Ssl3, Tls
    

    上記実行結果より、 SSL 3.0, TLS 1.0 が有効化されていることが分かります。ここで Tls12 と表示される場合は TLS 1.2 が有効になっているため、別の原因が考えられます。

  2. PowerShell で TLS 1.2 を有効化します

    > [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    
    1. のコマンドを再度実行し Tls12 と表示されれば、 TLS 1.2 が有効になっていることを確認できます。

なお、上記手順では PowerShell を起動する度に、 TLS 1.2 を有効化するコマンドを入力する必要があるため、少々面倒です。

そこで、 PowerShell を起動したら、自動的に TLS 1.2 を有効化するように設定します。
bash でいう .bash_profile のようなものが PowerShell にもあるので、そこから設定していきます。
※レジストリから設定する方法もあるようですが、レジストリはあまりいじりたくないので

下記コマンドで PowerShell のプロファイルの場所を確認します。

> $profile
C:\Users\xxxxx\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

コマンドの実行結果より、
C:\Users\xxxxx\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 のファイルをテキストエディタで開きます。
※ユーザ名部分は xxxxx でマスキングしています。自身の環境に応じて適宜置き換えてください

下記を追記してファイルを保存します。
PowerShell を新たに起動し、 [Net.ServicePointManager]::SecurityProtocol の実行結果が Tls12 と表示されれば設定完了です。
これで毎回 TLS 1.2 を有効化するコマンドを入力しなくても良くなりました。

[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;

TLS 1.2 以外も有効化する

TLS 1.2 のみだと、まだまだ対応していないところもあると思います。その場合は下記コマンドのように、有効化したいバージョンを -bor でつなげます。
※下記コマンドは TLS 1.2 と TLS 1.1 を有効化する場合です

[System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11

ちなみに、 PowerShell でサポートしているバージョンは下記コマンドから確認できます。

> [enum]::GetNames([Net.SecurityProtocolType])
SystemDefault
Ssl3
Tls
Tls11
Tls12

参考文献

26
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
27