WindowsのRDPファイルを自己署名証明書で署名する(1-2. RDP署名)

Windows 覚書

前編で作成した自己署名証明書を使い、Windows標準の rdpsign.rdp ファイルを署名する。

さらに、証明書の拇印を「信頼済みの .rdp 発行元」としてグループポリシーへ登録し、「このリモート接続の発行元を確認する」という警告が表示されない状態にする。最後に、RDPファイルをドラッグ&ドロップするだけで再署名できるBATも作成する。

この記事で扱う警告

対象は、.rdp ファイルを開いたときに表示される次の警告である。

リモート デスクトップ接続のセキュリティ警告
このリモート接続の発行元を確認する

これは .rdp ファイルそのものの発行元に対する警告である。

リモート コンピューターのIDを識別できません

など、接続先RDPサーバーのTLS証明書に対する警告とは別物なので混同しない。

Microsoftは、RDPファイルの署名によって作成者・配布元と改ざんの有無を確認できる一方、署名がファイルの安全性そのものを保証するわけではないと説明している。

準備するもの

前編の作業が完了していることを確認する。

  • Cert:\CurrentUser\MyMy RDP Publisher がある
  • 証明書の HasPrivateKeyTrue
  • C:\RDPs\MyRdpPublisher.cer がある
  • 署名対象の example.rdp がある

例として、次の配置で作業する。

C:\RDPs\
├─ MyRdpPublisher.cer
├─ example.rdp
└─ sign_rdp_dragdrop.bat

rdpsignのヘルプを確認する

Windows Updateによって仕様や表示が変わる可能性があるため、まず使用中の rdpsign のヘルプを確認する。

rdpsign /?

Windows 11で確認した rdpsign.exe バージョン 10.0.26100.8875 のヘルプでは、/sha256 HASH を「署名証明書のSHA256 hash」と説明していた。

現在のMicrosoft Learnでも、/sha256 はWindows Server 2016以降で /sha1 を置き換えるオプションであり、引数は証明書のSHA-256拇印と説明されている。

実環境で確認できた拇印の指定方法

一方、今回の実環境では、証明書ストアの Thumbprint プロパティに表示された空白なし40桁の拇印を次の形式で渡すと正常に署名できた。

rdpsign /sha256 0123456789ABCDEF0123456789ABCDEF01234567 "C:\RDPs\example.rdp"

記事中の40桁の値はダミーである。自分の証明書の値へ置き換える。

$cert = Get-ChildItem 'Cert:\CurrentUser\My' |
    Where-Object Subject -eq 'CN=My RDP Publisher' |
    Sort-Object NotBefore -Descending |
    Select-Object -First 1

$cert.Thumbprint

Microsoft Learnとローカルヘルプの文言は「SHA256 hash」だが、実環境で成功した値は従来の X509Certificate2.Thumbprint として取得した40桁の拇印だった。この差があるため、この記事では実際に成功したコマンドを変更せず記録する。Windowsの更新後や別PCでは、まず rdpsign /? とMicrosoft Learnを確認し、必要なら /l で書き込み前に試す。

上書きせず署名をテストする

Microsoft Learnによると、/l は署名と出力結果をテストするが、入力ファイルを置き換えない。

rdpsign /sha256 0123456789ABCDEF0123456789ABCDEF01234567 /l "C:\RDPs\example.rdp"

通常の署名では入力ファイルが上書きされる。必要なら先にバックアップを取る。

Copy-Item 'C:\RDPs\example.rdp' 'C:\RDPs\example.before-signing.rdp'

RDPファイルを署名する

テストに問題がなければ署名する。

rdpsign /sha256 0123456789ABCDEF0123456789ABCDEF01234567 "C:\RDPs\example.rdp"

拇印をコピーしたときに空白や不可視文字が混ざらないようにする。

署名結果を確認する

.rdp はテキストファイルなので、署名前後を比較できる。署名後は、末尾付近に次の項目が追加される。

signscope:s:...
signature:s:...

値は長いため、記事やログへそのまま貼り付ける必要はない。PowerShellでは次のように項目の存在を確認できる。

Get-Content 'C:\RDPs\example.rdp' |
    Select-String '^(signscope|signature):s:'

署名後の .rdp ファイルを開くと、発行元として次のように証明書のSubjectが認識される。

発行元: My RDP Publisher

RDP設定を編集すると署名対象の内容が変わるため、その後にもう一度署名する。

信頼済みRDP発行元として登録する

署名しただけでは、「このリモート接続の発行元を確認する」という警告が表示される場合がある。警告を出さないため、使用している証明書を信頼済みRDP発行元として登録する。

Win + R を押し、次を実行する。

gpedit.msc

ローカルグループポリシーエディターで次の場所へ移動する。

コンピューターの構成
  → 管理用テンプレート
    → Windows コンポーネント
      → リモート デスクトップ サービス
        → リモート デスクトップ接続のクライアント

現在のMicrosoft Learnで案内されているポリシー名は次のとおり。

信頼済みの .rdp 発行元を表す証明書の拇印を指定する

2026年7月のセキュリティ更新より前は、次のようなSHA-1を明記した名称だった。Windowsのバージョンや管理用テンプレートによって表示名が異なる場合がある。

信頼された .rdp 発行元を表す証明書の SHA1 サムプリントを指定する

ポリシーを有効にして、証明書の拇印を登録する。

今回の実環境では、証明書ストアに表示された空白なし40桁の Thumbprint を登録すると、セキュリティ警告が表示されなくなった。

0123456789ABCDEF0123456789ABCDEF01234567

この値もダミーである。

Microsoft Learnの現行仕様では、2026年7月の更新後はこのポリシーがSHA-2拇印に対応し、SHA-1拇印は後方互換扱いになった。SHA-2拇印を登録する場合の接頭辞などは、更新状態によって異なる可能性があるため、ポリシー画面の「ヘルプ」に表示される書式へ従う。書式を推測して入力しない。

設定後、コマンドプロンプトまたはPowerShellで次を実行する。

gpupdate /force

必要なら起動中の mstsc.exe をすべて終了し、署名済み .rdp ファイルをもう一度開く。

警告が消えたことを確認する

今回の実環境では、次の組み合わせで「このリモート接続の発行元を確認する」警告が表示されなくなった。

  • rdpsign /sha256 に証明書ストアの40桁 Thumbprint を指定
  • 同じ40桁の値を信頼済みRDP発行元ポリシーへ登録
  • gpupdate /force を実行
  • mstsc.exe を終了して署名済み .rdp を開き直す

これは今回の環境で確認した結果であり、現行のMicrosoft Learnが推奨するSHA-2拇印の登録とは区別して記録している。

ドラッグ&ドロップで署名するBAT

RDPファイルは編集するたびに再署名が必要になる。次のBATを C:\RDPs\sign_rdp_dragdrop.bat として保存する。

@echo off
setlocal EnableExtensions

set "CERT_FILE=%~dp0MyRdpPublisher.cer"

if not exist "%CERT_FILE%" (
    echo エラー: 証明書ファイルが見つかりません。
    echo.
    echo %CERT_FILE%
    echo.
    pause
    exit /b 1
)

set "THUMBPRINT="

for /f "usebackq delims=" %%H in (`powershell.exe -NoProfile -Command "$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2('%CERT_FILE%'); $cert.Thumbprint"`) do (
    set "THUMBPRINT=%%H"
)

if not defined THUMBPRINT (
    echo エラー: 証明書の Thumbprint を取得できませんでした。
    echo.
    pause
    exit /b 1
)

echo 使用する証明書:
echo   %CERT_FILE%
echo.
echo Thumbprint:
echo   %THUMBPRINT%
echo.

where rdpsign >nul 2>nul
if errorlevel 1 (
    echo エラー: rdpsign が見つかりません。
    echo Remote Desktop 関連機能が入った Windows 環境で実行してください。
    echo.
    pause
    exit /b 1
)

powershell.exe -NoProfile -Command ^
    "$thumb = '%THUMBPRINT%';" ^
    "$cert = Get-ChildItem Cert:\CurrentUser\My,Cert:\LocalMachine\My -ErrorAction SilentlyContinue |" ^
    "Where-Object { $_.Thumbprint -eq $thumb -and $_.HasPrivateKey } |" ^
    "Select-Object -First 1;" ^
    "if ($null -eq $cert) { exit 1 } else { exit 0 }"

if errorlevel 1 (
    echo エラー: 秘密鍵付きの証明書が Windows 証明書ストアに見つかりません。
    echo.
    echo .cer ファイルだけでは署名できません。
    echo 同じ証明書の秘密鍵付き証明書が
    echo CurrentUser\My または LocalMachine\My に必要です。
    echo.
    pause
    exit /b 1
)

if "%~1"=="" (
    echo .rdp ファイルをこのバッチへドラッグ^&ドロップしてください。
    echo.
    pause
    exit /b 1
)

set "FAILED=0"

:loop
if "%~1"=="" goto done

if /i not "%~x1"==".rdp" (
    echo スキップ: "%~1" ^(.rdp ファイルではありません^)
    shift
    goto loop
)

echo.
echo 署名中: "%~1"

rdpsign /sha256 %THUMBPRINT% "%~1"

if errorlevel 1 (
    echo 失敗   : "%~1"
    set "FAILED=1"
) else (
    echo 成功   : "%~1"
)

shift
goto loop

:done
echo.

if "%FAILED%"=="0" (
    echo すべて完了しました。
    exit /b 0
) else (
    echo 一部失敗しました。
    pause
    exit /b 1
)

BATの処理は次のとおり。

  1. BATと同じディレクトリから MyRdpPublisher.cer を探す
  2. PowerShellで .cer の拇印を取得する
  3. CurrentUser\My または LocalMachine\My に、同じ拇印かつ秘密鍵付きの証明書があるか確認する
  4. 渡されたファイルの拡張子が .rdp か確認する
  5. rdpsign で署名する
  6. 複数の .rdp ファイルが渡された場合は順番に処理する

%~dp0 は、実行中のBAT自身が置かれているディレクトリを表す。set "CERT_FILE=.\MyRdpPublisher.cer" では、ドラッグ&ドロップやショートカット経由の実行時に別のカレントディレクトリを参照する可能性があるため、ここでは %~dp0 を使う。

CERだけをコピーしても署名できない

BATは MyRdpPublisher.cer から拇印を取得するが、.cer の中には秘密鍵がない。

別PCで同じBATを使う場合は、前編のPFXバックアップから秘密鍵付き証明書を CurrentUser\My または LocalMachine\My へ復元する必要がある。

セキュリティ上の注意

今回設定しているのは、RDPのセキュリティ警告を全面的に無効化する設定ではない。指定した証明書で署名された .rdp 発行元だけを信頼する設定である。

「不明な発行元からの .rdp ファイルを許可する」設定を、警告を消す目的だけで安易に有効化しない。

署名証明書の秘密鍵が第三者へ渡ると、その人物も同じ発行元としてRDPファイルへ署名できる。PFXとパスワードは厳重に管理する。

署名済みであっても、入手元が不明なRDPファイルを安全だと判断してはいけない。署名は発行元と改ざんの有無を確認する材料であり、接続先やリダイレクト設定の安全性を保証するものではない。

まとめ

RDPファイルの発行元警告を制御するため、次の順番で設定した。

  1. RDP署名用の自己署名証明書を作る
  2. rdpsign /sha256.rdp ファイルを署名する
  3. 同じ証明書の拇印を信頼済みRDP発行元ポリシーへ登録する
  4. gpupdate /force 後に署名済みRDPファイルを開き直す
  5. 今後の再署名にはドラッグ&ドロップ用BATを使う

今回の環境では40桁の証明書 Thumbprint で署名とポリシー設定の両方が動作した。ただし、現在のMicrosoft LearnはSHA-2拇印を推奨しているため、Windows更新後はローカルのヘルプとポリシー画面の指示も確認する。

参考資料

RDP リモートデスクトップ rdpsign グループポリシー
スポンサーリンク
☆Geha☆をフォローする