以前にLet's Encryptで発行した証明書をRemote Desktopの証明書にも割り当ててみるという話を書いたのですが、Let's Encrpytの証明書をPowerShellリモート接続でも使うことができたので、メモとして残しておきます。
PowerShellリモート接続とは何か?
PowerShell からリモートのサーバを操作できる機能です。
用意するもの
- Let's Encrypt で発行した SSL/TLS 証明書のインストール(ここでは手順は説明しません)
- 証明書のフィンガープリント
(Let's Encryptでなくとも、商用の証明書でもOKですが。)
作業手順
PowerShellリモート接続の受け側を設定する。
基本的には受け側のサーバで Enable-PSRemoting するだけです。
ただし、Amazon Web Services のインスタンスでこれを設定する場合には、これだけではうまく行きません。これについては d-hisame さんのはてなダイヤリーの下記エントリをご参照いただくと参考になります。
http://d.hatena.ne.jp/a-hisame/20131101/1383332166
私の手元には、この件の手順のログが残っていないので、後日補足しようかと考えています。
証明書のフィンガープリントを確認する
受け側の機材の PowerShell で "dir cert:\LocalMachine\My" を実行します。ここで出てきた ThumbPrint と FQDNホスト名を使います。
PS C:\Users\hoge> dir cert:\LocalMachine\My
ディレクトリ: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
0123456789ABCDEF0123456789ABCDEF01234567 CN=ssl.example.com
winrm create を実行して、HTTPS のリスナを作る
winrm create をこんなふうに実行します。
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="[サーバのFQDN]";CertificateThumbprint="[ThumbPrint]";Port="5986"}'
なお、winrm create -? で表示されるヘルプには @{ ... } がシングルクオートで囲まれておらず、そのヘルプの通りに実行すると絶対にエラーになります。
というわけで、実行例はこちら。
PS C:\Users\hoge> winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ssl.example.com";CertificateThumbprint="0123456789ABCDEF0123456789ABCDEF01234567";Port="5986"}'
ResourceCreated
Address = http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters
ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
SelectorSet
Selector: Address = *, Transport = HTTPS
PS C:\Users\hoge>
クライアント側から Enter-PSSession -UseSSL で接続してみる
こんなカンジでクライアント側から接続してみます。
PS C:\Users\local> Enter-PSSession -ComputerName [FQDNホスト名] -Credential [ユーザ名] -UseSSL
[ssl.example.com]: PS C:\Users\hoge\Documents>
接続できない場合は各種パケットフィルタ(Windowsファイヤウォール、ネットワーク機器、クラウドサービスのセキュリティグループの設定など)を確認し、5986/TCP が開いていることを確かめてください。
なお、PowerShell ISE で「リモート PowerShell のタブの新規作成」では私の環境ではHTTPS接続できていません。PowerShell ISE をお使いの場合でも Enter-PSSession -UseSSL して頂く必要があるかもしれません。
しかし、そもそも HTTPS での PowerShell リモート接続は必要なのか?
最後の最後でこんなことを書くのもどうかと思いますが、HTTPS での PowerShell リモート接続の意味や目的を正しく理解することが大事です。
というのも、マイクロソフトの下記URLに掲載の記事によると「使用されているトランスポート プロトコル (HTTP または HTTPS) に関係なく、PowerShell リモート処理では、常にすべての通信が、初期認証後に、セッションごとの AES256 対称キーを使用して暗号化されます。」と書かれています。だから暗号化が目的ならば HTTPS での接続は必須ではありません。
つまり、こういうことです。
- 接続は HTTP で行っても暗号化されている。
- しかし HTTPS 接続することで、接続先サーバが正しいサーバであり、Man-in-the-Middleではない、安全な接続がたしかに行われていることを検証できる。