Loading certificate in Azure App Service for Linux

· Azure App Service, Certificate, Cloud, .NET Core, Tips & Tricks

In this post, I will explain how you can load a certificate through code in Azure App Service for a Linux container. The steps to use a certificate in Azure App Service are already described in Microsoft documentation. However, I found a couple of gaps in the documentation specifically for Linux. Hence, I decided to write this post.

To follow along you would need an App Service for Linux hosted on Azure.

Why need a certificate

There are various reasons you may need to access a certificate in your code, like encryption/ decryption, authentication, authorization and so on. For example, Raven DB requires a private client certificate to allow access to the data store.

Step 1: Upload your certificate

You can upload the certificate in different ways, such as directly through the portal, Azure CLI or CI/CD pipeline.

A private certificate uploaded to Azure portal.

Tip: Certificate, its thumbprint and passphrase key for a private certificate are sensitive information. DO NOT store them in your source control.

Step 2: Make your certificate accessible

To access your certificate, through code, you need to make it accessible by creating an app setting WEBSITE_LOAD_CERTIFICATES . WEBSITE_LOAD_CERTIFICATES should be set to comma-separated values of certificate thumbprints.

WEB_LOAD_CERTIFICATES app setting

WEBSITE_LOAD_CERTIFICATES is a magic app setting that makes your certificates accessible to your application. For Linux container, it keeps the private certificates at the location /var/ssl/private and public certificates at /var/ssl/certs.

You can view the certificates by logging intossh at https://YOUR_APP_SERVICE_NAME.scm.azurewebsites.net/webssh/host

Note: Azure App service accepts a certificate of .pfx and .cer formats only. It then exposes them as .p12 and .der formats respectively.

For a windows container, Azure App Service automatically exposes the certificate paths through environment variables such as WEBSITE_PRIVATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATH. Unfortunately, you either need to set the environment variables manually or hard code the certificate path in your code for a Linux container.

STEP 3: Accessing certificate in C# code

Finally, you can access certificate in your C# code as shown below:

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

public static class CertificateExtensions
{
    // Private certificatePath: $"/var/ssl/private/{thumbprint}.p12"
    // Public certificatePath: $"/var/ssl/certs/{thumbprint}.der"

    public static X509Certificate2 LoadCertificate(string thumbprint, string certificatePath)
    {
        if (string.IsNullOrWhiteSpace(thumbprint))
        {
            throw new ArgumentNullException(nameof(thumbprint));
        }

        if (string.IsNullOrWhiteSpace(certificatePath))
        {
            throw new ArgumentNullException(nameof(certificatePath));
        }

        var bytes = File.ReadAllBytes(certificatePath);
        var certificate = new X509Certificate2(bytes);
        return certificate;
    }
}

Note: To load a private certificate (p12), you do not need to supply a passphrase/ password. I found it the hard way since the code snippet to load a private certificate was missing in the Microsoft documentation. I have raised a PR to fix this. At the time of writing the PR is still in review.

#Azure #Azure App Service #C# #Certificate #Cloud #.NET #.NET Core #Tips & Tricks

2 comments

Comments were carried over from the previous site and are closed.

Martin Andersson ·

In your Note, it says “you do not need to supply a passphrase/ password.”
We also found out the hard way (after two days of debugging/logging, et.c.) that in fact you SHOULD NOT provide a password, because that was what broke it. Really non-intuitive there.
Thank you anyway for your helpful post.

tutike2000 ·

Sadly I’m just getting an “You do not have permission to view this directory” exception when trying to read the certificate. I can see the file when SSH-ing into the server