This week I decided to modify the sample of my previous post: Step by step: Scale ASP.NET Core with Docker Swarm so you can add TLS to your ASP.NET Core applications and Dockerize it.

Let’s see how I changed the application in order to make it work:

Add HTTPS support for Kestrel


I added the following line to the dependencies in the project.json file.

1    "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.1",

Configure Kestrel to use HTTPS


In the Main method I configured Kestrel to use HTTPS. Don’t worry about the cert.pfx certificate file because it will be created inside the docker container.

Note that in line 8 I also configured the application to use port 443.

 1    public static void Main(string[] args)
 2    {
 3        var host = new WebHostBuilder()
 4            .UseKestrel((o) => 
 5            {
 6                o.UseHttps(new X509Certificate2(@"cert.pfx", Configuration["certPassword"]));
 7            })
 8            .UseUrls("https://*:443")
 9            .UseContentRoot(Directory.GetCurrentDirectory())
10            .UseStartup<Startup>()
11            .Build();
12
13        host.Run();
14    }

Now It’s time to show you how to Dockerize the application:

Create a dockerfile


 1# We use the microsoft/dotnet image as a starting point.
 2FROM microsoft/dotnet 
 3
 4# Install git
 5RUN apt-get install git -y
 6
 7# Clone the source code
 8RUN git clone -b ssl https://github.com/cmendible/aspnet-core-helloworld.git
 9
10# Set our working folder
11WORKDIR aspnet-core-helloworld/src/dotnetstarter
12
13# Restore nuget packages
14RUN dotnet restore
15
16# Build the application using dotnet!!!
17RUN dotnet build
18
19# Set password for the certificate as 1234
20# I'm using Environment Variable here to simplify the .NET Core sample.
21ENV certPassword 1234
22
23# Use opnssl to generate a self signed certificate cert.pfx with password $env:certPassword
24RUN openssl genrsa -des3 -passout pass:${certPassword} -out server.key 2048
25RUN openssl rsa -passin pass:${certPassword} -in server.key -out server.key
26RUN openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
27RUN openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
28RUN openssl pkcs12 -export -out cert.pfx -inkey server.key -in server.crt -certfile server.crt -passout pass:${certPassword}
29
30# Expose port 443 for the application.
31EXPOSE 443
32
33# Start the application using dotnet!!!
34ENTRYPOINT dotnet run

Create a Docker image


With the dockerfile in place run the following command

1sudo docker build -t httpssample .

Now you have an image named httpssample with all the dependencies and code needed to run the application.

Test the Docker image

To test the Docker image run the following command

1sudo docker run -it -p 443:443 httpssample 

Browse to https://localhost Your browser will warn about the certificate because it’s self signed.

Run the Docker image as a daemon process

Now that you know that everything is working as expected use the following command to run the Docker image as a daemon process

1docker run -t -d -p 443:443 httpssample 

You can get a copy of the docker file here: https://github.com/cmendible/dotnetcore.samples/tree/main/docker.helloworld.https

Hope it helps!