検索
連載

Windowsでリモートデスクトップ接続のサーバに「正しい」証明書を割り当てるTech TIPS

リモートデスクトップで接続しようとすると、リモートPCのIDを識別できない、という警告がクライアント側に表示されることがある。これはデフォルトでサーバの認証に自己発行の証明書が使われているからだ。そこで、正規の証明書を割り当てて、警告を表示されないようにする方法を説明する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「Tech TIPS」のインデックス

連載目次

リモートデスクトップ接続時に毎回、このエラーが生じるのを何とかしたい!
リモートデスクトップ接続時に毎回、このエラーが生じるのを何とかしたい!

対象OS:Windows 8.1 / Windows 10 / Windows Server 2012 / Windows Server 2012 R2 / Windows Server 2016


 リモートデスクトップ接続でリモートのWindows PCに接続しようとすると、ローカルPCに「このリモート コンピューターの ID を識別できません。接続しますか?」という警告メッセージが表示されることがある。こんな警告を見ると、このまま接続していいのか、もしかしたらどこか別の悪意のあるサイトに接続されてしまうのではないか、といった不安を感じてしまうかもしれない。

 いったい何が原因でこのようなメッセージが表示されるのだろうか? 本稿では、その理由と対策について説明する。

リモートデスクトップ接続時に証明書の警告メッセージが表示される理由

●ローカルPCはリモートPCを電子証明書で検証する

 リモートデスクトップ接続では、クライアント(ローカルPC)がサーバ(リモートPC)を認証するのに「電子証明書」(以下、単に証明書と略)が用いられる。簡単に説明すると、ローカルPC側は接続時にリモートPCが提示する証明書を検証し、リモートデスクトップ接続アプリで指定した接続先の名称を正しく表しているかどうか確認する。

リモートデスクトップ接続時にローカルPCはリモートPCを電子証明書で検証する(概要)
リモートデスクトップ接続時にローカルPCはリモートPCを電子証明書で検証する(概要)

 この検証に成功すれば、ローカルPCは「正しい」リモートPCだと判断して接続を確立しようとする。逆に、何らかの問題があって検証に失敗すると、ローカルPCは「正しくない」リモートPCかもしれないと判断し、冒頭のスクリーンショットのような警告メッセージを表示する。

●デフォルトでリモートPCには「正しくない」証明書が設定済み!?

 上記の警告が表示されるのは、デフォルトでリモートPCの証明書が「自己発行」すなわち自身の証明を自分で作った(発行した)ものであることが原因だ(自己発行証明書についてはTIPS「Webサイトのデジタル証明書を確認する」参照)。リモートPC側でリモートデスクトップ接続を有効にすると、専用の自己発行証明書が作成され、リモートデスクトップ接続時の認証に用いられるように自動で設定される。

 この仕組みにより、リモートPC側で証明書の設定を変更しなくても、接続時の警告を無視して[はい]ボタンを押せば「取りあえず」リモートデスクトップ接続が利用できるので手軽だ。

デフォルト設定のリモートPCへの接続時に表示される証明書の警告メッセージ(1/2)
デフォルト設定のリモートPCへの接続時に表示される証明書の警告メッセージ(1/2)
デフォルト設定のリモートPCへの接続時に表示される証明書の警告メッセージ(2/2)
デフォルト設定のリモートPCへの接続時に表示される証明書の警告メッセージ(2/2)

 その半面、警告を無視することはサーバの認証をしていないも同然で、不正なサーバによるなりすましを防止できないといった危険がある。例えるなら、HTTPSでWebサイトに接続したときにしばしば表示されるSSLサーバ証明書の警告やエラーを無視して、接続を強行するのと似たようなものだ。特に、インターネットを介してリモートPCと接続する環境では避けたい状況だ。

 この問題を根本的に解決するには、信頼されている認証局(CA: Certificate Authority)から発行された正しい証明書をリモートPCに割り当てる設定をすることだ。

リモートPCでリモートデスクトップ接続の「正しい」証明書を設定する

 リモートデスクトップ接続で、リモートPCを証明するための証明書は、「PowerShell」を使って設定する必要がある。以下では、その手順を順番に説明しよう。

●接続先(リモートPC)の名称をメモする

 まずはローカルのPCで、リモートデスクトップ接続アプリに指定している接続先(リモートPC)の名称をメモしておく。

ローカルPCのリモートデスクトップ接続アプリから接続先の名称をメモする
ローカルPCのリモートデスクトップ接続アプリから接続先の名称をメモする

●PowerShellを管理者権限で起動する

 次に、リモートPCのWindows OSに管理者アカウントでログオンしてから、PowerShellを管理者権限で起動する。

 [スタート]ボタンをクリックしてスタートメニューを開き、[Windows PowerShell]−[Windows PowerShell]または[PowerShell]−[PowerShell <メジャーバージョン番号>]を右クリックし、[その他]−[管理者として実行」をクリックする。見つからなければ、スタートメニューや「ここに入力して検索」などで「powershell」を検索して[Windows PowerShell]または[PowerShell <メジャーバージョン番号>]アイコンを見つけ、右クリックして[管理者として実行]をクリックする。

 Windows Serverであれば、タスクバーにあるPowerShellアイコンを右クリックし、[管理者として実行]を選んでもよい。

●PowerShellのバージョンを確認する

 PowerShellの画面が表示されたら、次の行を入力、実行する。

$PSVersionTable.PSVersion.Major -ge 5


 ここで「True」と表示されたら、次の「PowerShellでリモートデスクトップ接続に使える証明書を探す」へ進んでいただきたい。

リモートPCのPowerShellで証明書を設定する(1/3)
リモートPCのPowerShellで証明書を設定する(1/3)

 一方、「False」と表示されたら、PowerShellのバージョンが低い(Ver.5未満)ため、以下の設定作業は失敗してしまう。既存のアプリケーションやPowerShellスクリプトとの互換性に注意しつつ、PowerShellをVer.5以降にアップグレードしていただきたい。例えば、以下のダウンロードページからWindows Management Framework 5.1をインストールすれば、PowerShell 5.1にアップグレードできる。

●PowerShellでリモートデスクトップ接続に使える証明書を探す

 PowerShellの画面で次の行を入力、実行する。その際には必ず、<接続先の名称>を、先ほどメモした接続先の名称で置き換えること。

$dnsName = "<接続先の名称>"


 続いて、以下のリストを入力、実行する。クリップボードにコピーして、PowerShellにペーストするのが手っ取り早いだろう。

Get-ChildItem -Recurse Cert:\LocalMachine\ | `
?{ $_.HasPrivateKey } | `
?{ `
  Test-Certificate $_ `
    -DNSName $dnsName -EKU 1.3.6.1.5.5.7.3.1 -ErrorAction SilentlyContinue `
} | `
?{ `
  if ($_.Subject -match "CN=(?<SubjectCN>[a-z0-9\.\-]+\??)") `
    { $subjectCN = $Matches.SubjectCN } `
  if ($_.Issuer -match "CN=(?<IssuerCN>[a-z0-9\.\-]+\??)") `
    { $issuerCN = $Matches.issuerCN } `
  ($subjectCN -ne $issuerCN) `
} | `
sort NotAfter | `
%{ `
  $latestCert = $_ ; `
  $_ | fl -Property Subject,FriendlyName,NotAfter,Thumbprint `
}


 すると、幾つかの警告の後に、リモートデスクトップ接続に利用できる証明書の候補一覧が表示される。上記のリストは、リモートPCに保存されている証明書から、リモートデスクトップ接続に必要な条件を満たしたものを抽出して、有効期限が古い順に表示する(つまり、一番下に表示された証明書が最も長持ちする)。

リモートPCのPowerShellで証明書を設定する(2/3)
リモートPCのPowerShellで証明書を設定する(2/3)

 もし、1つも候補の証明書が表示されなければ、ここで作業はいったん中断し、後述の「リモートデスクトップ接続に利用できる証明書を取得するには」のようにして、リモートデスクトップ接続に使える証明書を新たに発行、取得してほしい。

●見つかった証明書をリモートデスクトップ接続に割り当てる

 候補が1つ以上表示された場合は、以下の行を入力、実行する。すると、選び出された証明書がリモートデスクトップ接続用として実際に割り当てられる。

Get-CimInstance `
  -Namespace root\cimv2\terminalservices `
  -ClassName Win32_TSGeneralSetting | `
Set-CimInstance -Property @{SSLCertificateSHA1Hash=$latestCert.Thumbprint}
Get-CimInstance `
  -Namespace root\cimv2\terminalservices `
  -ClassName Win32_TSGeneralSetting | `
fl -Property *


リモートPCのPowerShellで証明書を設定する(3/3)
リモートPCのPowerShellで証明書を設定する(3/3)

 これで設定作業は完了だ(システムの再起動は不要)。

リモートデスクトップ接続に利用されている証明書を確認する

 設定が完了したら、リモートデスクトップ接続を試してみよう。ローカルPC側のリモートデスクトップ接続画面の[コンピューター名]には、サーバ側で選択した証明書のサブジェクト代替名(DNS Name)のいずれかに一致する名称を指定して(一致しないとその旨の警告やエラーが発生する)、接続を始める。今度は「このリモート コンピューターの ID を識別できません。接続しますか?」という警告が表示されずに接続が確立されるはずだ。

 次に、リモートデスクトップの画面で[Ctrl]+[Alt]+[Break]キー(あるいは[Ctrl]+[Alt]+[Shift]+[Pause]キー)を押して全画面表示にして、画面上端に表示されたバーの左端にある南京錠のアイコンをクリックする(バーが表示されなければ、マウスカーソルを画面上端に沿わせるとプルダウンで現れるはずだ)。すると「リモート デスクトップ接続」というダイアログが現れる。ここに「リモート コンピューターの ID は、サーバーの証明書を使って確認されました」と表示されれば、正しい証明書が割り当てられていると判断できる。

リモートデスクトップ接続でリモートPCの証明に用いられる証明書を確認する
リモートデスクトップ接続でリモートPCの証明に用いられる証明書を確認する

リモートデスクトップ接続に利用できる証明書を取得するには

 前述の手順でリモートデスクトップ接続に使える証明書がリモートPC内から見つからなかった場合は、信頼できる認証局からリモートPC用の証明書を発行してもらい、それをリモートPCに格納する必要がある。

 リモートデスクトップ接続に必要な証明書は、WebサーバのHTTPS接続に利用するSSLサーバ証明書がそのまま利用できる。つまり、Webサーバ用のSSLサーバ証明書を発行できる認証局から、証明書を取得すればよい。

 例えば、企業内システムでActive Directory証明書サービスによるプライベート認証局が運用されているなら、「Webサーバー(WebServer)」という証明書テンプレートで発行した証明書がリモートデスクトップ接続に利用できる。また「コンピューター(Machine)」テンプレートによる証明書も利用可能だ。

 具体的な証明書の取得手順は、認証局や証明書の販売代理店などによって大幅に異なる。それぞれのヘルプを参照するか、管理担当者に問い合わせるなどして確認していただきたい。公的な認証局から証明書を取得する場合は、次の記事で説明している証明書の発行、取得の手順が参考になるだろう。

 

有効期限が切れる前に証明書の再割り当てが必要

 ここまでの手順で、正規の認証局から発行された証明書をリモートデスクトップ接続に割り当てた場合、その有効期限に注意する必要がある。

 証明書には有効期限があり、リモートデスクトップ接続に利用できるWebサーバ証明書の場合、発行から1年間または2年間のことが多い。期限が切れると、当然ながら証明書は無効となり、リモートデスクトップ接続時にもその旨の警告が表示されるようになる。

 そのため、有効期限内に証明書を更新する必要がある。ただその際、証明書の拇印が変わるため、更新した証明書を上記の手順でリモートデスクトップ接続に割り当て直す必要がある。

 証明書の期限切れを事前に確認する方法はいくつかある。Windows OSの場合、保存されている証明書の期限が切れる数カ月前からイベントログにその警告が載る。それをチェックして期限切れを防止できる。また、Tech TIPS「OpenSSLでSSLサーバ証明書の有効期間を自動的に確認して更新漏れを防ぐ」のようにして、有効期限を監視してもよいだろう。

■他のリモートデスクトップTIPS


■更新履歴

【2020/04/21】証明書の有効期限と、PowerShell 7の起動について追記しました。PowerShellのプログラムコードを修正して、割り当て後の証明書を正しく確認できるようにしました。

【2020/04/15】Windows 10とPowerShell 7に対応しました。PowerShellで自動的に最適な証明書を抽出、設定できるようにしました。

【2013/12/16】初版公開時、WindowsクライアントではPowerShellコマンドレットによる証明書の割り当てができない、と記していましたが、実際には可能です。また、PowerShellを管理者として実行することを明記しました。以上、おわびして訂正いたします。

【2013/09/20】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る