web-dev-qa-db-ja.com

AzureFunctions-クライアント証明書認証を構成します

関数は、消費計画で、クライアント証明書を使用した関数へのアクセスの承認をサポートしていますか?説明されているアプローチに似たもの ここ ?基本的に、呼び出し元が有効なクライアント証明書を提示しない場合、コードにその承認ルーチンを実装しなくても、接続要求をすぐに拒否する関数ランタイムを探しています。

6
Luis Delgado

要件に基づいて、この問題を確認するためにC#HttpTrigger関数を作成しました。コアコードは次のとおりです。

if(req.Headers.Contains("X-ARR-ClientCert")) 
{   
    byte[] clientCertBytes = Convert.FromBase64String(req.Headers.GetValues("X-ARR-ClientCert").FirstOrDefault());
    var clientCert = new X509Certificate2(clientCertBytes);
    return req.CreateResponse(HttpStatusCode.OK,"Thumbprint: "+clientCert.Thumbprint);
}
return req.CreateResponse(HttpStatusCode.OK, "Hello world");

App Service Planの場合、この機能は次のように機能します。

enter image description here

私のテストによると、この機能は消費計画の下でも期待どおりに機能する可能性があります。

WebアプリのTLS相互認証を構成する方法 に従うか、Azure Portalにログインして関数アプリに移動し、[プラットフォームの機能]タブで[ネットワーク]> [SSL]をクリックして、[受信クライアント証明書]オプションを有効にします。

3
Bruce Chen

私が思いついたコードは次のとおりです。注:これはAzure Functions v1の場合、reqがHttpRequestMessageの場合です。

発信者:

X509Certificate2 clientCert = req.GetClientCertificate();

if (!IsValidClientCertificate(clientCert))
{
    return req.CreateErrorResponse(HttpStatusCode.Unauthorized, "A valid client certificate is not found");
}

Azure Functions v2の場合、req.HttpContext.Connection.ClientCertificateを使用してHttpRequestからクライアント証明書を取得できます。

基本的な検証機能:

static bool IsValidClientCertificate(X509Certificate2 clientCert)
{
    // check the cert's thumbprint against expected thumbprint
    if (clientCert.Thumbprint != "<expected thumprint>"
    { 
        return false;
    }

    // check that we're within the cert's validity period
    if (DateTime.Now > clientCert.NotAfter || DateTime.Now < clientCert.NotBefore)
    {
        return false;
    }

    // optionally check cert chaining validity
    // if(!clientCert.Verify()) { return false; }
}
1
UnionP