IdentityServer4 でアクセストークンの署名と検証に証明書を使う方法

証明書はあらかじめ用意しておく。 openssl なり何なり使って、自己署名証明書を作成するなら↓みたいな感じ。

#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
PRIVATE_PEM=$DIR/private.pem
PUBLIC_PEM=$DIR/public.pem
PFX=$DIR/<証明書ファイル名>.pfx
PASSWORD=$1

if [ -z "$PASSWORD" ]
then
    PASSWORD="<パスワード>"
fi

echo "秘密鍵を生成"
openssl genrsa 2048 > $PRIVATE_PEM

echo "公開鍵を生成"
echo """JP
<都道府県>
<市区町村>
<組織名>
<部門名>
<FQDN>
<メールアドレス>
""" | openssl req -x509 -days 36500 -new -key $PRIVATE_PEM -out $PUBLIC_PEM

echo "証明書を生成"
openssl pkcs12 -export -in $PUBLIC_PEM -inkey $PRIVATE_PEM -out $PFX -password pass:$PASSWORD

あとは IdentityServer4 の構成で、用意した証明書を指定すれば OK。

var builder = services.AddIdentityServer(options =>
{
    options.EmitStaticAudienceClaim = true;
    options.AccessTokenJwtType = "jwt";
});

if (Environment.IsDevelopment())
{
    builder.AddDeveloperSigningCredential();
}
else
{
    var cert = new X509Certificate2(
      ".pfx ファイルのパス",
      ".pfx ファイルのパスワード",
      X509KeyStorageFlags.MachineKeySet |
      X509KeyStorageFlags.PersistKeySet |
      X509KeyStorageFlags.Exportable
    );
    builder.AddSigningCredential(cert);
}