しばたテックブログ

気分で書いている技術ブログです。

Windows PowerShellとTLS 1.2

昨今のセキュリティ情勢を受けてトランスポート層の暗号化プロトコルにTLS 1.2を強制するサイトが増えてきています。

身近な例としては、GitHubが今年の2月にHTTPS通信においてTLS 1.2以前のプロトコルを廃止しています。

github.blog

本エントリではWindows PowerShellとPowerShell CoreのHTTPS通信におけるTLSの扱いについて触れていきます。

Windows PowerShellの場合

Windows PowerShellで使用される暗号化プロトコルは[Net.ServicePointManager]::SecurityProtocolプロパティで確認でき、

PS C:\> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls

と、デフォルトではSSL3TLS(1.0)が利用可能です。

このためデフォルト設定では最初に例示したGitHubへのアクセスはできません。
GitHubへのアクセスは下図の様にエラーとなってしまいます。

f:id:stknohg:20180430183454p:plain

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へのアクセスが可能になっているのが見て取れます。

f:id:stknohg:20180430183505p:plain

この設定はPowerShellセッション全体で有効であり永続化はできません。
ですので常用したい場合はプロファイルにこのコードを仕込んでおけば良いでしょう。

.NET Frameworkの既定値を変える

Windows PowerShellは.NET Framework製であり使用される暗号化プロトコルは.NET Frameworkのそれに従います。

Japan IE Support Team Blogのこちらのエントリにある様にセキュリティアドバイザリを適用するかレジストリを変更することで.NET 4.5以降の設定を変えることができます。

social.msdn.microsoft.com

これにより.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の場合)

f:id:stknohg:20180430183557p:plain

UserVoice

設定変更すればWindows PowerShellでTLS 1.2の通信ができることは確認できましたが、いちいち変更するのは面倒です。
UserVoiceにネイティブサポートする様にリクエストが上がっていますので興味のある方はこちらにVoteすると良いでしょう。

survey
Please feel free to provide feedback or file bugs here.
  • 42 votes
  • 6 comments

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.

windowsserver.uservoice.com

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モジュールを紹介します。

github.com

これはテキサスの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卒業となったそうです