0

作成したのではなく、現在維持している Azure アプリ サービスがあります。アプリ サービスは、拇印によって Key Vault 内の証明書を見つけ、それを使用して、夜間ジョブを介して SQL 作業を実行するためのトークンを取得します。

有効期限の 80% (12 か月) が経過すると、証明書が自動更新されるように設定されているようです。証明書が更新された日、私の夜間の仕事は失敗し始めました。新しい証明書が問題の根底にあると確信しています。

私が言えるのは、次のように動作するように設計されていることです。

  • Azure Logic App 経由でジョブが起動される
  • レポート処理 API への無名の POST (最終結果は、メール添付用の .PDF レポートの作成になります)
  • API には、現在の証明書の拇印を含む Appsetting.json があります。
  • 以下のコード行で拇印を使用して、証明書ストアで証明書を検索します。
  • 証明書は、アクセス トークンの取得と作業の実行に使用されます

古い証明書と新しい証明書の両方をローカル マシンにインストールし、プロセス全体を実行すると、古い証明書が検出され、この行で新しい自動生成された証明書が失敗します。また、Azure で作成し、Azure からエクスポートして開発マシンにインポートしようとする新しい証明書でも失敗します。問題の拇印が正しく、更新されていることを確認するために、appsettings を 2 回または 3 回チェックしました。

var signingCert = store.Certificates.OfType<X509Certificate2>().FirstOrDefault(x => x.Thumbprint == _appSettings.AzureAD.CertificateThumbprint);

これが 1 年前に構成されたとき、プロセスは App Service の TLS/SSL 設定ブレードに移動し、秘密キー証明書 (.pfx) を選択し、最後に + Key Vault 証明書をインポートすることでした。

そこから Key Vault と証明書を選択し、Appsettings.Json を変更して新しい拇印を作成しました。

古い (もうすぐ期限切れになる) 証明書と対応する appsettings の拇印エントリでは機能するのに、新しく作成された証明書と対応する正しい拇印エントリでは機能しないのはなぜですか?

問題の App Service の構成を見てきましたが、App Service がそれに登録されているすべての証明書を表示できるようにする必要があることを理解したときに、次の設定がありますよね?

WEBSITE_LOAD_CERTIFICATES = *

編集: さらにテストした後、Azure からエクスポートしてコンピューターにインポートする証明書は、証明書ストアを正常に反復し、有効な拇印を提供する証明書を見つけることがわかりました。それがしないのは、その証明書を使用してアクセストークンを取得することです。完全なコードは以下のとおりです。

間もなく期限切れになる証明書は、適切なアクセス トークンを取得し、DB から適切なデータを取得して残りのプロセスを実行します。

他のすべての証明書で得られる例外は、base64 エンコーディングに関する何かを示唆していますが、それを完全に理解することはできません。何か案は?

元の証明書を除くすべての例外:

クライアント アサーションに無効な署名が含まれています

元の証明書のみを使用したこのコードによる成功したアクセス トークン:

private async Task<string> GetDatabaseTokenFromCert()
    {
        X509Certificate2 cert;
        var store = new X509Store(StoreLocation.CurrentUser);
        var authContext = new AuthenticationContext(_appSettings.AzureAD.AADInstance + _appSettings.AzureAD.TenantId);

        try
        {
            store.Open(OpenFlags.ReadOnly);
            var signingCert = store.Certificates.OfType<X509Certificate2>().FirstOrDefault(x => x.Thumbprint == _appSettings.AzureAD.CertificateThumbprint);
            
            if (signingCert == null)
            {
                throw new FileNotFoundException("Cannot locate certificate for DB access!", _appSettings.AzureAD.CertificateThumbprint);
            }

            cert = signingCert;

        }
        finally
        {
            store.Close();
        }

        var certCred = new ClientAssertionCertificate(_appSettings.AzureAD.ClientId, cert);

        var result = await Retry(() => authContext.AcquireTokenAsync(_appSettings.SqlConfig.ResourceId, certCred));
        
        return result?.AccessToken;

    }
4

1 に答える 1