しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Windows PowerShellとTLS 1.2

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

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

githubengineering.com

本エントリでは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以降の設定を変えることができます。

これにより.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.
  • 35 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である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

PowerShell Core 6.0の初期セットアップスクリプトを作りました

blog.shibata.tech

前にPSCoreUpdateというPowerShell Coreのアップデートを自動化するモジュールを作ったとお知らせしました。
このエントリ中で、

なお、このモジュールはあくまで更新のためのツールなので最初にPowerShell Core 6.0をインストールするのは手動で行う必要があります。

と記載し、この点に関しては今も変わってはいないのですが、初回インストールが手動なのはやっぱり面倒だったのでセットアップスクリプトを別に作ってみました。

初回インストールスクリプト

スクリプトはPSCoreUpdate内のこのページで公開しています。

github.com

PowerShell Coreのインストール手順はGitHubDocsで公開されており、基本的はこの手順を各OS・ディストリビューション毎にまとめただけのスクリプトになります。

基本方針として、Windows PowerShellやBashのコンソールにコピペして実行すれば良しなに最新のPowerShell Coreをインストールしてくれるものにしています。
方式としてはChocolateyRVMのインストール手順を参考にしています。*1

スクリプトの中身についてはGitHubで確認してください。
以下に現在のインストール手順を載せておきます。

Windows

前提条件として、Windows PowerShell 4.0以上がインストールされている必要があります。
(これはPowerShell Core 6.0をMSIからインストールするための前提条件です)

コマンドプロンプトから実行する場合

REM Command prompt
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/Install-LatestPowerShell.ps1'))"

PowerShellコンソールから実行する場合

# Windows PowerShell
Set-ExecutionPolicy Bypass -Scope Process -Force; [Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/Install-LatestPowerShell.ps1'))

macOS

macOS Sierra (10.12)以上が対象です。

# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_mac.sh | bash -s

Ubuntu

Ubuntu 17.04、16.04、14.04で実行可能です。

# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_ubuntu.sh | bash -s

RHEL、CentOS、Fedora

以下のディストリビューションで実行可能です。

  • RHEL 7
  • CentOS 7
  • Fedora 26、25
# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_rhel.sh | bash -s

Debian

Debian 9、8.7+で実行可能です。

# Bash
\wget -q --no-check-certificate https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_debian.sh -O - | bash -s

[Experimental] openSUSE、SLES

以下のディストリビューションで実行可能です。

  • openSUSE 42.1
  • SLES 12
# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_suse.sh | bash -s

こちらは現在の最新バージョン(6.1.0-preview.1)ではzypperの設定まではうまくいくものの、PowerShellのインストール時に依存関係のエラーが出てしまいインストールが必ず失敗します。
詳細はこのへんを見てください。

このスクリプトを実行した後に手動で

sudo zypper install powershell

を実行し、依存関係のエラーを無視してインストールを続行すればインストールすることができます。
この依存関係のエラーについてはそのうち新しいバージョンで解消されると思います。

*1:手順は参考にしてますが、個人的な信条としてChocolateyが嫌いなのでローカルマシンにChocolateyをインストールしたくないのです...

PowerShell Core 6.0をデバッグ実行する - Visual Studio 2017編

前回の続き的な。

blog.shibata.tech

前回の時点では「まだVisual Studio 2017でのビルドはうまく動作しない」と説明しましたが、つい最近Visual Studioで動作させるための修正が完了したので実際に試してみました。

github.com

はじめに

基本的なところは前回と同様です。
IDEがVisual Studio CodeからVisual Studio 2017になっただけと考えて差し支えないでしょう。

ただ、詳細は後述しますが、Visual Studioだけでビルドに関するすべての手順を賄えるわけではなく少しだけPowerShellのコマンドを併用する必要があります。

PowerShellをデバッグ実行する

ここから具体的な手順の説明に入ります。

1. Gitのインストール

ソースコードをCloneするのにGitクライアントが必要です。
適当にインストールしてgitコマンドが使える様にしておいてください。

gitforwindows.org

ちなみに、Visual Studioをインストールした後にVisual Studio Installerから「Git for Windows」を選択してインストールしても構いません。

2. ソースのClone

PowerShellのリポジトリよりソースコードをCloneします。

今回はとりあえずデバッグ実行できれば良いので前回同様にリポジトリを直接Cloneしておきます。

任意のディレクトリで以下の様に--recursiveオプションを付けてgit cloneしてください。

git clone --recursive https://github.com/PowerShell/PowerShell.git

3. Visual Studio 2017のインストール

www.visualstudio.com

Visual Studio 2017をダウンロードしてインストールしてください。

私はProfessionalとEneterpriseで動作確認しましたがどのエディションでも大丈夫だと思います。
手元のVisual Studioは結構昔にインストール済みだったので具体的なインストール手順は紹介できませんが、

  • .NETデスクトップ開発 - C#をコンパイルできる標準的な構成
  • .NET Coreクロスプラットフォームの開発 - 要.NET Core SDK

のワークロードがインストールされていれば良いと思います。

なお、PowerShell Coreで必要な.NET Core SDKのバージョンは随時更新されていますので、場合によってはこちらから個別にダウンロードしてインストールする必要があるかもしれません。

本エントリを書いている時点では、PowerShell Core 6.1.0-preview.1をコンパイルするのに.NET Core SDK 2.1.4が必要です。

4. その他ツールのインストール

上記の他に

  • PowerShell 6.0の実行バイナリ(pwsh)
  • RCEdit

が必要になります。

こちらは前回と同様ですので、build.psm1モジュールのStart-PSBootstrap関数を使ってインストールしておけば良いでしょう。

# cd [PowerShellのルートディレクトリ]
cd .\PowerShell\
Import-Module .\build.psm1
Start-PSBootstrap

5. ビルドとデバッグ実行

CloneしたソースのルートディレクトリにPowerShell.slnというソリューションファイルがあるのでVisual Studioからこれを開きます。

f:id:stknohg:20180412001744p:plain

14のプロジェクトから成るソリューションで、Windowsの場合powershell-win-coreプロジェクトのProgram.csにエントリポイントがあります。


この初期状態で単純にソリューションのビルドをしても下図の様に幾つかエラーがでてしまいます。

f:id:stknohg:20180412001839p:plain

これはソースをCloneした直後の状態ではメッセージ等のリソースファイルが存在していないため、リソース不足によるコンパイルエラーとなってしまうためです。

リソースはVisual Studioからは作成できず*1build.psm1モジュールのStart-PSBuild関数を使う必要があります。

次の様にbuild.psm1モジュールをインポートし、-ResGenパラメータを指定してStart-PSBuildを実行してください。

# cd [PowerShellのルートディレクトリ]
cd .\PowerShell\
Import-Module .\build.psm1
Start-PSBuild -ResGen

エラー無く処理が終われば必要なリソースは作成されています。

f:id:stknohg:20180412001923p:plain


リソースが出来ている状態でビルドすればエラー無く完了するはずです。

f:id:stknohg:20180412002020p:plain

デバッグを開始してやれば下図の様にふつうにステップ実行できます。

f:id:stknohg:20180412002047p:plain

最後に

Visual Studio Codeも悪くはありませんがやっぱりVisual Studioの圧倒的な支援は最高です。
ほんとうに捗ります。

*1:もしできる方法があれば教えてください...