Kestrel Web サーバーにSSL証明書をバインドする - Kestrel Web サーバーへのSSL証明書の組み込み - ASP.NET

Kestrel Web サーバーにSSL証明書をバインドする手順を紹介します。

概要

ASP.NET Core のKestrel WebサーバーでSSL証明書をバインドするには、appsettings.json のURLの設定部分にクライアント証明書のファイルを指定します。

書式

appsettings.jsonのURLの書式設定は以下です。
appsettings.json
{
  /* 略 */
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:80"
      },
      "Https": {
        "Url": "https://*:443",
        "ClientCertificateMode": "AllowCertificate",
        "Certificate": {
          "Path": "(SSL証明書 pfxファイルのパス)",
          "Password": "(SSL証明書 pfxファイルのパスワード)"
        }
      }
    }
  },
  /* 略 */
}

記述例

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:80"
      },
      "Https": {
        "Url": "https://*:443",
        "ClientCertificateMode": "AllowCertificate",
        "Certificate": {
          "Path": "ipentec_com.pfx",
          "Password": ""
        }
      }
    }
  },
  "AllowedHosts": "*"
}

事前準備

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

取得した証明書をプロジェクトのフォルダに配置します。


ソリューションエクスプローラーで証明書のpfxファイルを選択してプロパティを確認します。 [出力ディレクトリにコピー]の設定がデフォルトでは、[コピーしない]の設定です。


[出力ディレクトリにコピー]の設定を"常にコピーする"に変更します。

プログラム例

ASP.NET Coreアプリケーションを作成します。

コード

以下のコードを準備します。
Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello ASP.NET Core World!");

app.Run();
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:80"
      },
      "Https": {
        "Url": "https://*:443",
        "ClientCertificateMode": "AllowCertificate",
        "Certificate": {
          "Path": "_.ipentec.com.pfx",
          "Password": ""
        }
      }
    }
  },
  "AllowedHosts": "*"
}

解説

Kestrel, Endpoints キー内に Https キーを作成します。 UrlにKestrel WebサーバーがリッスンするURL、ポート番号を設定します。 ClientCertificateModeは、AllowCertificateに設定します。
CertificateキーのPath にpfxファイルのパスを指定します。今回はプログラムと同じディレクトリに証明書が配置されるため、 ファイル名のみを記述します。Passwordキーには、pfxファイルにパスワードがある場合に、パスワードを設定します。
  "Kestrel": {
    "Endpoints": {
     /* 中略 */
      "Https": {
        "Url": "https://*:443",
        "ClientCertificateMode": "AllowCertificate",
        "Certificate": {
          "Path": "_.ipentec.com.pfx",
          "Password": ""
        }
      }
    }
  }

ビルドと配置

プロジェクトをビルドして、アプリケーションを発行します。


パブリッシュフォルダに証明書のpfxファイルも含まれていることを確認します。


サーバーに配置します。

実行結果

今回はサーバーでASP.NET Coreのアプリケーションを実行してKestrel Webサーバーを起動する方法で動作確認します。 アプリケーションのexeファイルを実行すると、コマンドプロンプトのウィンドウが表示され下図の画面が表示されます。 ポート443でhttpsのリスニングが始まります。


httpsのURLでASP.NET CoreアプリケーションのURLにアクセスします。下図の画面が表示されます。 SSLのワーニングが表示されずにアプリケーションの結果が表示されます。


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


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


*.ipentec.comの証明書であることも確認できます。


開発環境などがインストールされていない別のマシンでも確認してみます。こちらもSSLの警告が表示されずにページが表示できています。


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