昨今のセキュリティ情勢を受けてトランスポート層の暗号化プロトコルにTLS 1.2を強制するサイトが増えてきています。
身近な例としては、GitHubが今年の2月にHTTPS通信においてTLS 1.2以前のプロトコルを廃止しています。
本エントリではWindows PowerShellとPowerShell CoreのHTTPS通信におけるTLSの扱いについて触れていきます。
Windows PowerShellの場合
Windows PowerShellで使用される暗号化プロトコルは[Net.ServicePointManager]::SecurityProtocol
プロパティで確認でき、
PS C:\> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
と、デフォルトではSSL3
、TLS(1.0)
が利用可能です。
このためデフォルト設定では最初に例示したGitHubへのアクセスはできません。
GitHubへのアクセスは下図の様にエラーとなってしまいます。
Windows PowerShellでTLS 1.2通信を許可する
デフォルトではTLS 1.2
の通信はできませんが設定により有効にすることができます。
以下の様に先述の[Net.ServicePointManager]::SecurityProtocol
プロパティに[Net.SecurityProtocolType]::Tls12
を追加してやればOKです。
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
実行例)
暗号化プロトコルにTLS 1.2が増えGitHubへのアクセスが可能になっているのが見て取れます。
この設定はPowerShellセッション全体で有効であり永続化はできません。
ですので常用したい場合はプロファイルにこのコードを仕込んでおけば良いでしょう。
.NET Frameworkの既定値を変える
Windows PowerShellは.NET Framework製であり使用される暗号化プロトコルは.NET Frameworkのそれに従います。
Japan IE Support Team Blogのこちらのエントリにある様にセキュリティアドバイザリを適用するかレジストリを変更することで.NET 4.5以降の設定を変えることができます。
これにより.NET 4.5で動作するPowerShell 4.0以降であれば、その既定値を変えることができます。
変更例)
# 要管理者権限 New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\ -Name SchUseStrongCrypto -Value 1
レジストリを変えた後で[Net.ServicePointManager]::SecurityProtocol
プロパティの値を確認すると、下図の様にTLS 1.0~TLS 1.2が有効になっていることがわかります。
(Windows PowerShell 5.1 on Windows 10の場合)
UserVoice
設定変更すればWindows PowerShellでTLS 1.2の通信ができることは確認できましたが、いちいち変更するのは面倒です。
UserVoiceにネイティブサポートする様にリクエストが上がっていますので興味のある方はこちらにVoteすると良いでしょう。
Add support for TLS 1.2 (Invoke-WebRequest, Invoke-RestMethod)
Invoke-WebRequest and Invoke-RestMethod commands only support TLS 1.0 protocol. We need to have a native support for newer TLS (1.2) versions for modern web interfaces.
PowerShell Coreの場合
PowerShell Coreで使用される暗号化プロトコルも[Net.ServicePointManager]::SecurityProtocol
プロパティで確認でき、
PS C:\> [Net.ServicePointManager]::SecurityProtocol
SystemDefault
とSystemDefault
という設定値になっています。
これはソースを読むとTLS 1.0~TLS 1.2がサポートされていることがわかります。
SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12;
このためPowerShell CoreではデフォルトでTLS 1.2が有効であり追加の設定は必要ありません。
【補足】BetterTlsモジュール
最後に補足としてBetterTlsモジュールを紹介します。
これはテキサスのMVP元MVP*1であるMark Krausさんが作ったモジュールで、先述のWindows PowerShellでのTLS設定の変更をいくつかのコマンドにして公開したものになります。
基本的には他のモジュールに組み込んで使うことが想定されているのですが単体でも使用できます。
簡単に使い方を説明して本エントリの終わりにしたいと思います。
インストール
# Install-Moduleでインストール Install-Module BetterTls -Scope CurrentUser
使用例
# 現在の設定を確認 PS C:\> Get-Tls Ssl3, Tls # TLS 1.2を有効にする PS C:\> Enable-Tls -Tls12 -Confirm:$false # 変更後の設定を確認 PS C:\> Get-Tls Ssl3, Tls, Tls12
*1:LinkedInに転職して中のひとになったためMVP卒業となったそうです