YARP (Yet Another Reverse Proxy)をWindows サービスとして実行し、SSLのアクセスを受け付けられるようにする

リバースプロキシソフトウェアの YARP (Yet Another Reverse Proxy) をWindows サービスとして実行し、SSLのアクセスも受け付けられるよう設定します。

概要

こちらの記事では、YARPをインストールする手順を紹介しました。 この記事では、YARPをWindowsサービスとして実行し、かつ、SSLのアクセスも受け付けられる設定手順を紹介します。

プログラム

プロジェクト作成

ASP.NET Core アプリケーションを作成し、YARPのパッケージをインストールします。 手順の詳細は、こちらの記事を参照してください。

SSL証明書の準備

SSLの証明書を作成します。今回はLet's Encrypt でワイルドカード証明書を取得しています。証明書はpfxファイルとして保存します。
Let's Encryptでpfxファイルを取得する手順についてはこちらの記事を参照してください。

取得した証明書のpfxファイルをプロジェクトのフォルダに配置し、ソリューションエクスプローラーで証明書のpfxファイルを選択して [出力ディレクトリにコピー]の設定を"常にコピーする"に変更します。手順の詳細はこちらの記事を参照してください。

今回の例ではpfxのファイル名は"_.ipentec.com.pfx"としています。

コード

以下のコードを記述します。
Program.cs
using Microsoft.Extensions.Hosting.WindowsServices;

var webApplicationOptions = new WebApplicationOptions {
  ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default,
  Args = args,
};

var builder = WebApplication.CreateBuilder(webApplicationOptions);
builder.Host.UseWindowsService();
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();

app.MapReverseProxy();
app.Run();
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  /*追加*/
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:80"
      },
      "Https": {
        "Url": "https://*:443",
        "ClientCertificateMode": "AllowCertificate",
        "Certificate": {
          "Path": "_.ipentec.com.pfx",
          "Password": ""
        }
      }
    }
  },
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "destination1": {
            "Address": "https://example.com/"
          }
        }
      }
    }
  }
}

解説

Program.cs

Program.csでは、ASP.NET Coreアプリケーションをサービスとして実行できるようにするためのコードを追加しています。 コードの詳細についてはこちらの記事を参照してください。

appsettings.json

Kestrel, Endpoints, Https の記述を追加し、Kestrel WebサーバーでリッスンするURLとポート番号を設定します。
Certificateオブジェクトを記述し、SSLアクセス時のpfx証明書のパスを設定しています。 書式の詳細はこちらの記事を参照してください。

ファイルの配置

プロジェクトを発行し、サーバーに配置します。今回は C:\yarp\ に配置しています。pfxファイルのSSL証明書も同じディレクトリに配置します。

サービス登録/削除スクリプトの作成

以下のバッチファイルを作成します。実行ファイルのパスは配置したYARPのリバースプロキシ ASP.NET Coreアプリケーションのexeファイルを指定します。
create-yarpdemo-ssl-service.bat
sc create YARPDemo binPath= "C:\yarp\ServiceYarpSslDemo.exe" start= auto displayname= "YARP Demo Service"

remove-yarpdemo-service.bat
sc delete YARPDemo

サービスの作成

作成したサービスの作成コマンドを実行し、サービスを作成します。 作成したサービスを起動します。

実行結果

https のURLでYARPのサーバーにアクセスします。SSLのワーニングが表示されずにexample.comのコンテンツをプロキシできています。


接続を確認します。[接続がセキュリティで保護されています]のメッセージが表示されています。


証明書を確認します。有効な証明書が設定されている旨が表示されます。


作成したpfxファイルの証明書が設定されています。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-03-07
作成日: 2023-03-07
iPentec all rights reserverd.