Windows Server 2012 R2 の AD FS サービス起動時に TCP ポート 49443 が使用されている場合、ユーザー証明書認証が動作しない

スポンサーリンク

Active Directory Federation Services (AD FS) の役割がインストールされた Windows Server 2012 R2 を再起動した後、クライアント端末から認証回りの動作でエラーになっていました。

イベント ログを確認すると、「ソース: AD FS、イベント ID: 102 レベル: エラー」が記録、TCP ポート 49443 で競合しているためにエラーが発生していたことが判明しました。

性質が悪いことにイベント ログにはエラーが記録されているにも関わらず、AD FS サービス (adfssrv) は「実行中」となっているので、「エラーは出ているけど、サービスは動いているので現状問題なし」になりかねない状況でした。

発生原因については、コマンド プロンプトから「netstat -ano」で TCP ポート 49443 を使用しているプロセスIDを確認、「tasklist /SVC」で確認したプロセス ID から TCP ポート 49443 を使用しているプロセス (サービス) 名を確認することで、競合しているプロセス (サービス) 名を特定することはできます。

しかし、実際に確認したところ競合しているプロセス (サービス) 名を特定することはできず、TCP ポート 49443 は ephemeral (一時) ポートの範囲内であること、また AD FS サービスは「自動 (開始遅延)」であることから、サービス起動前に TCP ポート 49443 を用いて他のサーバとの通信 (生死監視、通知など) を行っていた、と推測しています。

Technet サイトやブログの情報では、TCP ポート 49443 に対する使用、およびファイアウォールの解放などの記載はありますが、回避方法については確認した限り特にアナウンスされていません (現象発生頻度が少ないのか、単に現象に気が付いていないのか、はたまたサービス、システムの再起動で回避できているので問題なしとしているか…)。

運用していく中で現象が再発しても困るため、TCP ポート 49443 を待受ポートして使用するプロセス (サービス) が存在していなければ、回避策としては以下の 2つとなるかと。

  • TCP ポート 49443 を ephemeral ポート範囲外に変更する方法
  • Set-AdfsProperties コマンドレットを用いてユーザー証明書認証で使用する TCP ポート 49443 から変更する方法

問題が回避されたかどうかは、回避策実行後にイベント ログから「ソース: AD FS、イベント ID: 100 レベル: 情報」が記録されていれば大丈夫かと思います。

ちなみに、netsh コマンドを用いたポートの除外は Windows Server 2012、Windows Server 2012 R2 環境ではうまく動作しませんでした。

TCP ポート 49443 を ephemeral ポート範囲外に変更する方法

※フェデレーション サーバー ファームを構成している場合、ファーム内のすべてのサーバ上で実施する必要があります。

  1. 管理者権限でコマンド プロンプト (cmd.exe) を起動します。
  2. 以下のコマンドを入力、実行し、ephemeral ポート範囲 (開始ポート、ポート数) を表示します。
    netsh int ipv4 show dynamicport tcp
    netsh int ipv4 show dynamicport udp
    netsh int ipv6 show dynamicport tcp
    netsh int ipv6 show dynamicport udp
    
  3. 以下のコマンドを入力、実行し、ephemeral ポート範囲 (開始ポート、ポート数) を変更、設定します。
    netsh int ipv4 set dynamicport tcp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数>
    netsh int ipv4 set dynamicport udp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数>
    netsh int ipv6 set dynamicport tcp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数>
    netsh int ipv6 set dynamicport udp start=<ephemeral ポート開始番号> num=<ephemeral ポート確保数>
    

    例:

    netsh int ipv4 set dynamicport tcp start=59152 num=6384
    netsh int ipv4 set dynamicport udp start=59152 num=6384
    netsh int ipv6 set dynamicport tcp start=59152 num=6384
    netsh int ipv6 set dynamicport udp start=59152 num=6384
    

  4. 以下のコマンドを入力、実行し、変更後の ephemeral ポート範囲 (開始ポート、ポート数) を表示します。
    netsh int ipv4 show dynamicport tcp
    netsh int ipv4 show dynamicport udp
    netsh int ipv6 show dynamicport tcp
    netsh int ipv6 show dynamicport udp
    

  5. 以下のコマンドを入力、実行し、ADFS サービスを再起動します。
    net stop adfssrv
    net start adfssrv
    

Set-AdfsProperties コマンドレットを用いてユーザー証明書認証で使用する TCP ポートを変更する方法

  1. 管理者権限で Windows PowerShell を起動、以下のコマンドレットを入力、実行し、ADFS モジュールをインポートします。
     Import-Module ADFS 
  2. 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポート (TlsClientPort) を確認します。
     Get-AdfsProperties 

  3. 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポートを設定します。
    ※設定する TCP ポートが他のプロセス (サービス) で使用していないことを確認した上で実施する必要があります。
     Set-AdfsProperties -TlsClientPort <TlsClient で使用するポート番号> 

    例:

     Set-AdfsProperties -TlsClientPort 32443 

    実行後は、以下のメッセージが表示されます。

  4. ファイアウォールなどが設置されている場合、設定した TCP ポートでアクセス可能なように設定します。
  5. 以下のコマンドを入力、実行し、ADFS サービスを再起動します。
    ※フェデレーション サーバー ファームを構成している場合、ファーム内のすべてのサーバ上で実施する必要があります。
    net stop adfssrv
    net start adfssrv
    
  6. 以下のコマンドレットを入力、実行し、ユーザー証明書認証で使用する TCP ポート (TlsClientPort) が変更されていることを確認します。
     Get-AdfsProperties 

参考

スポンサーリンク
スポンサーリンク
スポンサーリンク