自己署名証明書のRD GatewayでWindowsサーバに接続

アイキャッチ AWS EC2

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。VPC環境に構築したPrivateなネットワーク内にあるWindowsサーバに接続する必要があるケースでは、Public IPを備えたRemote Desktop Gatewayを用意すれば、外部からプライベートなサーバにもRDP接続することが可能です。今回は自己署名証明書を利用したRDゲートウェイの設定方法をご紹介したいと思います。

概要

Remote Desktop Gatewayを利用することで、https通信を利用して、Gatewayを介したVPC内のインスタンスへのRDP接続が可能となります。下記イメージを参考に、Security Groupは適切に許可設定しておきましょう。

RDGW

Remote Desktop Gateway設定手順

Remote Desktop Gatewayインストール

下記コマンドでRemote Desktop Gatewayと管理ツールをインストールしておきましょう。

PS C:\Users\Administrator> Install-WindowsFeature RDS-Gateway,RSAT-RDS-Gateway

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {ネットワーク ポリシーとアクセス サービス,...
True    No             Success        {リモート デスクトップ ゲートウェイ ツール...
警告: Windows
自動更新が有効になっていません。新しくインストールした役割または機能が自動的に更新されるようにするには、[Windows
Update] を有効にしてください。

RD Gateway用のサーバ証明書設定

まずはサーバ証明書作成及び設定を行います。管理ツールから リモート デスクトップ サービス -> リモート デスクトップ ゲートウェイ マネージャー を起動します。

rd-gateway-manager-1_1

RDゲートウェイのプロパティから、SSL証明書タブを選択し、自己署名証明書作成を選んで、"証明書の作成とインポート"をクリックします。

rd-gateway-manager-2

接続時に利用するグローバルIPアドレス(またはPublic DNS名)を証明書名として作成します。

rd-gateway-manager-3

rd-gateway-manager-4

RDゲートウェイの管理ツールから作成されるサーバ証明書は、デフォルトで有効期限半年となってしまうようです。(※より長い有効期限の証明書を作成する手順は後述)

rd-gateway-manager-5

ポリシー設定

続けてポリシー設定を行います。今回はあまり細かい要件は考えずに、VPC内のプライベートな通信を利用したRDゲートウェイを構成する最低限の設定としています。新しい承認ポリシーの作成をクリックします。

rd-gateway-manager-6

RD CAPとRD RAPを選択して次へ。

rd-gateway-manager-7

任意の名前でRD CAP名を指定して次へ。

rd-gateway-manager-8

ローカルAdministratorsのみ接続を許可して次へ。ここで、RD Gateway Manager Crashing adding a RAP に記載の事象に遭遇した為、KB 3102467をアンインストールして対応しました。

rd-gateway-manager-9

デバイスリダイレクトやタイムアウト設定は今回は変更しませんでした。

rd-gateway-manager-10

rd-gateway-manager-11

内容を確認し、続けて、リソース承認ポリシーを設定します。

rd-gateway-manager-12

任意の名前でRD RAP名を指定して次へ。

rd-gateway-manager-13

任意のネットワークリソースへの接続を許可して次へ。

rd-gateway-manager-14

デフォルトのポート3389への接続を許可して次へ。

rd-gateway-manager-15

内容を確認して完了。

rd-gateway-manager-16

無事作成完了しました。

rd-gateway-manager-17

より有効期間の長いサーバ証明書を作成する

ここまでの手順でRDゲートウェイを利用できるようになりましたが、自己署名証明書の有効期間が半年と非常に短い為、長期間運用する場合は更新作業が面倒です。PowerShellから実行できるNew-SelfSignedCertificateコマンドレットでも、有効期間はデフォルト1年間から変更ができないようなので、今回は、MakeCertおよびPvk2Pfxを利用したサーバ証明書の作成手順をご紹介します。

MakeCertおよびPvk2Pfxの入手

MakeCertおよびPvk2Pfxは、Windows SDKに含まれています。RDゲートウェイにSDKをインストールすれば、直接インポートすることも可能ですが、証明書の作成時にのみ利用するだけですので、今回はクライアントPCとなるWindows環境にてWindows SDKをインストールして証明書を作成することにします。

前述のリンクからファイルをダウンロードして実行します。Windows Software Development KitだけインストールすればOKです。後は、普通にインストーラの指示に従ってインストールを進めれば問題ありません。

sdk_install_6

デフォルトでは、C:\Program Files (x86)\Windows Kits\8.1\bin配下のフォルダにコマンドが配置されているはずです。

C:\Program Files (x86)\Windows Kits\8.1\bin\x64>makecert -?
Usage: MakeCert [ basic|extended options] [outputCertificateFile]
Basic Options
 -sk  <keyName>      Subject's key container name; To be created if not present
 -pe                 Mark generated private key as exportable
 -ss  <store>        Subject's certificate store name that stores the output
                     certificate
 -sr  <location>     Subject's certificate store location.
                        <CurrentUser|LocalMachine>.  Default to 'CurrentUser'
 -#   <number>       Serial Number from 1 to 2^31-1.  Default to be unique
 -$   <authority>    The signing authority of the certificate
                        <individual|commercial>
 -n   <X509name>     Certificate subject X500 name (eg: CN=Fred Dews)
 -?                  Return a list of basic options
 -!                  Return a list of extended options

C:\Program Files (x86)\Windows Kits\8.1\bin\x64>makecert -!
Usage: MakeCert [ basic|extended options] [outputCertificateFile]
Extended Options
 -tbs <file>         Certificate or CRL file to be signed
 -sc  <file>         Subject's certificate file
 -sv  <pvkFile>      Subject's PVK file; To be created if not present
 -ic  <file>         Issuer's certificate file
 -ik  <keyName>      Issuer's key container name
 -iv  <pvkFile>      Issuer's PVK file
 -is  <store>        Issuer's certificate store name.
 -ir  <location>     Issuer's certificate store location
                        <CurrentUser|LocalMachine>.  Default to 'CurrentUser'
 -in  <name>         Issuer's certificate common name.(eg: Fred Dews)
 -a   <algorithm>    The signature's digest algorithm.
                        <md5|sha1|sha256|sha384|sha512>.  Default to 'sha1'
 -ip  <provider>     Issuer's CryptoAPI provider's name
 -iy  <type>         Issuer's CryptoAPI provider's type
 -sp  <provider>     Subject's CryptoAPI provider's name
 -sy  <type>         Subject's CryptoAPI provider's type
 -iky <keytype>      Issuer key type
                        <signature|exchange|<integer>>.
 -sky <keytype>      Subject key type
                        <signature|exchange|<integer>>.
 -l   <link>         Link to the policy information (such as a URL)
 -cy  <certType>     Certificate types
                        <end|authority>
 -b   <mm/dd/yyyy>   Start of the validity period; default to now.
 -m   <number>       The number of months for the cert validity period
 -e   <mm/dd/yyyy>   End of validity period; defaults to 2039
 -h   <number>       Max height of the tree below this cert
 -len <number>       Generated Key Length (Bits)
                        Default to '2048' for 'RSA' and '512' for 'DSS'
 -r                  Create a self signed certificate
 -nscp               Include Netscape client auth extension
 -crl                Generate a CRL instead of a certificate
 -eku <oid[<,oid>]>  Comma separated enhanced key usage OIDs
 -?                  Return a list of basic options
 -!                  Return a list of extended options

C:\Program Files (x86)\Windows Kits\8.1\bin\x64>pvk2pfx.exe

Usage:
    pvk2pfx -pvk <pvk-file> [-pi <pvk-pswd>] -spc <spc-file>
           [-pfx <pfx-file> [-po <pfx-pswd>] [-f]]

        -pvk <pvk-file>  - input PVK file name.
        -spc <spc-file>  - input SPC file name.
        -pfx <pfx-file>  - output PFX file name.
        -pi <pvk-pswd>   - PVK password.
        -po <pfx-pswd>   - PFX password; same as -pi if not given.
        -f               - force overwrite existing PFX file.

        if -pfx option is not given, an export wizard will pop up. in
        this case, options -po and -f are ignored.

MakeCertによる証明書作成

makecert.exeを使って、証明書を作成します。秘密鍵のパスワードが要求されますが、ここではすぐにpfx形式に変換してしまいますので、空のまま作成しました。特に指定はしませんでしたが、デフォルトで2039年まで有効な証明書が作成されました。-eオプションで明示的に変更することも可能です。

  • -nオプションで、証明書名(接続時に利用するグローバルIPまたはFQDN)を指定
  • -rオプションで、自己署名証明書として作成
  • -aオプションで、署名アルゴリズム強度は強いもの(sha512)に変更
  • -ekuオプションで、サーバ証明書(1.3.6.1.5.5.7.3.1)用途であることを示すOIDを指定
  • -svオプションで、出力する秘密鍵ファイル(*.pvk)を指定
  • 出力する証明書ファイル(*.cer)を指定
C:\Program Files (x86)\Windows Kits\8.1\bin\x64>makecert -n "CN=52.35.xxx.xxx" -r -a sha512 -eku 1.3.6.1.5.5.7.3.1 -sv C:\tmp\52.35.xxx.xxx.pvk C:\tmp\52.35.xxx.xxx.cer
Succeeded

Pvk2Pfxによるpfxファイルの作成

作成した証明書をインポートする為に、pvk2pfx.exeを使って、証明書と秘密鍵を1つのpfxファイルに変換します。無事pfxファイルが生成されたら、RDゲートウェイサーバ上にコピーします。

  • -pvkオプションで、秘密鍵ファイルを指定
  • -spcオプションで、証明書ファイルを指定
  • -pfxオプションで、出力するpfxファイルを指定
C:\Program Files (x86)\Windows Kits\8.1\bin\x64>pvk2pfx -pvk C:\tmp\52.35.xxx.xxx.pvk -spc C:\tmp\52.35.xxx.xxx.cer -pfx C:\tmp\52.35.xxx.xxx.pfx

pfxファイルで証明書インポート

RDゲートウェイのプロパティから、作成したpfxファイルを使って新しい証明書に置き換えます。個人ストアに証明書をインポートを選択して、"証明書の参照とインポート"をクリックします。

rd-gateway-manager-20

配置したpfxファイルを選択すると、パスワードが要求されます。今回はパスワードは設定していませんので、そのまま"OK"をクリックします。

rd-gateway-manager-21

rd-gateway-manager-22

無事、2039年まで有効な証明書がインポートできました。

rd-gateway-manager-23

ここで"OK"をクリックすれば、設定情報が反映され、RDゲートウェイが再起動されます。

rd-gateway-manager-24

インポートが終わったら、pfxファイルは削除しておきましょう。これで、煩わしい証明書更新作業にも悩まされることが無くなりました。今回はWindowsが用意してくれているツールを利用していますが、opensslを利用して証明書を作成し、pkcs12指定で生成したファイルでもpfxファイルとしてインポートができるはずです。

今回は、RDPクライアント側の利用手順は割愛しますが、クライアント側で証明書ファイル(*.cer)をインストールする際に、"信頼されたルート証明機関"を証明書ストアとして選択すれば、問題なく利用できました。

まとめ

セキュリティ意識の高い企業では、3389ポートの外部通信が制限されているケースも多いようですので、ぜひRDゲートウェイを上手に活用していただければと思います。RDゲートウェイに限らず、Windowsで利用できるサーバ証明書の作成ツール群は融通が効かないものが多く、やや使いづらい印象です。もちろん外部向けに公開するものは証明書をきちんと購入する必要がありますが、内部向けの運用では自己署名証明書も上手に活用したいところですよね。

この記事がどこかの誰かのお役に立てば嬉しいです。