Let’s Encrypt and Microsoft Remote Desktop Services

Installation Guide

Let’s Encrypt is a free SSL/TLS certificate provider, with automated certificate issuance and renewal tools for Linux and Windows. You can use it to automatically issue and renew SSL certificates on your web servers. This guide shows you how to correctly setup Let’s Encrypt for Microsoft Window’s Remote Desktop Services and IIS using freely available tools.

Let’s Encrypt is a great option for SSL/TLS Certificates, as the certificates can be renewed automatically (and it’s totally free!). I worked out this installation method after seeing the price of our upcoming Wildcard SSL Certificate renewal – I quickly realised the increased setup time would be quickly offset by the reduced certificate price.

What you need

I’ve tested this process on Windows Server 2012 R2, with all RDS Role Services housed on the one server. You will need to modify these instructions and the script if you have split your role services amongst multiple servers.

Setup Instructions

  1. Download Let’s Encrypt Windows Simple and extract the files to C:\Program Files\Lets Encrypt
  2. Download my Powershell script and save it as C:\Program Files\Lets Encrypt\RDS_INSTALL_CERT.ps1
  3. Run LetsEncrypt.exe
    1. Enter your email address
    2. Accept the terms and conditions
    3. Enter “N” to create a new certificate
    4. Select Option 1 for “Single binding of an IIS site”
    5. Select your IIS site from the list
    6. Select the “HTTP-01” option: “Create temporary application in IIS”
    7. After the certificate has been created, don’t let it create the auto-renewal scheduled task (we’ll do this later)

If all goes well, you should now have a new SSL Certificate installed in your IIS site. You can confirm this by opening your RDP site in a browser and checking that the SSL Certificate has been issued by Let’s Encrypt.

There should also be a series of certificate files saved in C:\ProgramData\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\

However, if you open Server Manager and navigate to Remote Desktop Services > Deployment Properties, you’ll see the four role services don’t have this new certificate.

Our job now is to install the certificates into RDS. You could do so using the “Select Existing Certificate” button, but you’ll need to do this manually every 60 days as the certificate comes up for renewal.

Instead, we’re going to use Powershell.

If you run the Powershell script, you’ll need to provide just two parameters:

  1. -CertificateImport – The path to the PFX file generated by Let’s Encrypt (found in C:\ProgramData\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\)
  2. -RDCB – The FQDN of your server (the internal DNS name used by Active Directory, not any external alias you may have)

Running this script within 10 minutes of generating the original certificates should allow it to install successfully.

You can check this from that same Deployment Properties windows in Server Manager. You can also try to access a Remote Resource and see which certificate it presents.

# Install a Let's Encrypt certificate to Remote Desktop Services
# Hacked together by Anthony Eden (https://mediarealm.com.au/)

#Credit: https://ryanmangansitblog.com/2014/06/17/deploying-rds-2012-wild-card-certificate-using-powershell/
#Credit: https://github.com/Lone-Coder/letsencrypt-win-simple/issues/400

param (

    [Parameter(Mandatory=$TRUE, HelpMessage="store the certificate localy (c:\)")]

    [Parameter(Mandatory=$TRUE, HelpMessage="Connection Broker FQDN")]

if ( ((get-date) - (ls $CertificateImport).LastWriteTime).minutes -gt 10){ exit }

# This is where a temporary certificate will be stored (we delete it at the end)
$tempPfxPath = 'C:\ProgramData\letsencrypt-win-simple\temp-pfx.pfx'

# Import the RemoteDesktop module
Import-Module RemoteDesktop

# Create the temporary certificate
$newCertPfx = Import-PfxCertificate -FilePath $CertificateImport -CertStoreLocation Cert:\LocalMachine\My -Exportable
$tempPasswordPfx = ConvertTo-SecureString -String "TemporaryPassword" -Force -AsPlainText
Export-PfxCertificate -cert $newCertPfx -FilePath $tempPfxPath -Force -NoProperties -Password $tempPasswordPfx
Remove-Item -Path $newCertPfx.PSPath

# Configure RDPublishing Certificate for RDS
set-RDCertificate -Role RDPublishing `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -Force `

# Configure First RDWebAccess Certificate for RDS
set-RDCertificate -Role RDWebAccess `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -Force `
# Configure  Second Certificate for RDS
set-RDCertificate -Role RDWebAccess `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -Force `

# Configure RDRedirector Certificate for RDS
set-RDCertificate -Role RDRedirector `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -force `

# Configure First RDGateway Certificate for RDS
set-RDCertificate -Role RDGateway `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -force `
# Configure Second RDGateway Certificate for RDS
set-RDCertificate -Role RDGateway `
   -ImportPath $tempPfxPath `
   -Password $tempPasswordPfx `
   -ConnectionBroker $RDCB -force `

# Cleanup the temporary PFX file
Remove-Item -Path $tempPfxPath

Automating the Renewal of Remote Desktop Certificates

All we need to do now is setup automatic renewal. Thankfully, this can be done with a simple batch script:

"C:\Program Files\Lets Encrypt\letsencrypt.exe" --renew --baseuri "https://acme-v01.api.letsencrypt.org/"
powershell -File "C:\Program Files\Lets Encrypt\RDS_INSTALL_CERT.ps1" -CertificateImport "C:\ProgramData\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\remote.example.com-all.pfx" -RDCB remote.example.com

Edit this script to contain the full path to your PFX file, and then schedule it to run in Task Scheduler once per day. The renewal will only take place close to the 60-day expiry window, and when that happens the Powershell script will update the RDS certificates.

Monitoring the Certificate Renewal

No one likes lapsed certificates or certificate warnings. Prevent this by subscribing to a free SSL Expiry Checker, such as CertificateMonitor.org (or the host-it-yourself version).


That’s it! Hopefully these instructions have allowed you to install a Let’s Encrypt Free SSL Certificate in Microsoft’s Remote Desktop Server. If you have any tips, please post them in the comments below!

Get the Broadcast Technology Newsletter

Sign up for the email newsletter about media and technology. Sent irregularly. No spam.

I'm Anthony Eden, and I'm a IT Professional, Broadcast Technician, Software Developer, and Solutions Engineer. I've been working in broadcast media since 2008, and developing software and websites for just as long. Right now, I provide freelance services through Media Realm - in particular, to the media and not-for-profit industries.

Follow Anthony on Twitter: @anthony_eden