Cover Image

Automatisk fornyelse av Let's Encrypt SSL-sertifikater mot syse.no sin DNS

 Thu 2022-12-01    DNS

Jeg har ansvaret for å oppdatere SSL/TLS-sertifikater for noen Windowsservere. Da det er "egne" tjenester og ikke kundetjenester, så satt jeg opp sertfikater fra Let's Encrypt i et forsøk på å holde kostnadene nede.

I over to år har jeg nå manuelt oppdatert sertifikatene på én av disse serverne ved å manuelt legge til TXT-record, verifisere, requeste, fjerne TXT-record, verifisere igjen og så starte tjenesten på nytt.

Dette måtte gjøres fordi vi først hadde DNS for domenet innomhus, og senere fordi DNS ble flyttet til syse.no.

Ikke at det på noen måte er noe galt med Syse sin DNS-server eller med Syse ellers, men de har ikke en API som gjør det mulig å sette opp DNS01-validering av domenenavnet. Jeg lurte lenge på hvordan dette kunne løses, men alt pekte i retning av å fortsette med manuell oppdatering annenhver måned eller å kjøpe et sertifikat med gyldighet på 1 år.

SIden ingen av de alternativene var særlig aktuelle, begynte jeg å grave litt i supportmaterialet på nettsidene til Syse. Der fant jeg et gullkorn - de har en DynDNS-klient, som bruker en TSIG-key for å oppdatere en DNS-sone hver gang IP-adressen endrer seg. De hadde til og med et bash-script jeg kunne bruke som utgangspunkt for prosjektet mitt!

Siden serveren kjører Windows Server og jeg bruker WACS som sertifikatmishandler, måtte jeg lage noen batchfiler.

  • add_txt_record.cmd
  • delete_txt_record.cmd
  • restart-apache2.4-webservice.bat

add/remove_txt_record.cmd er derivert fra Syses DynDNS bash script, konvertert til Windows CMD (batch) og modifisert til å gjøre helt andre ting enn det som var sannsynligvis var meningen at det skulle gjøre. Bakgrunnen for dette er som nevnt at Syse ikke tilbyr noen full API for manipulering av DNS-sonene, men de tilbyr en TSIG-key som fungerer som autorisering for modifisering av DynDNS, og denne kunne misbrukes litt til dette formålet.

restart-apache2.4-webservice.bat er bare for å stoppe og starte en Apache-service på serveren. Ja, Apache på Windows. Nei, det kan ikke migreres til Linux. Ja, det er teit.

I korte trekk er prosedyren denne:

  1. WACS holder styr på når sertifikatet skal fornyes
  2. Når det er tid for fornying, kjøres add_txt_record.cmd.
  3. Dette scriptet får kommandolinjedata fra WACS med informasjon om zone, hostnavn og TXT-data, dumper dette til en tekstfil og kjører så nsupdate mot ns.syse.no for å legge til en TXT record WACS trenger for å verifisere eierskap for domenet og for å kunne requeste nytt sertifikat fra Let's Encrypt.
  4. Når sertifikatet er mottatt og verifisert, kjører WACS delete_txt_record.cmd for å fjerne TXT record fra DNS via samme prosedyre som over.
  5. Til slutt kjøres restart-apache2.4-webservice.bat for å starte Apache2.4-tjenesten på nytt. Dette må gjøres for å laste inn det nye sertifikatet i webserveren for presentasjon til klienter som kobler seg til.

Forutsetninger for at dette skal fungere:

  1. Windows Server med Apache-service (helt spesifikt for akkurat mitt problem, men dette funker med IIS og standalone deployment også, samt med CertifyTheWeb og sikker andre sertifikatmanagere også).
  2. WACS (eller CertifyTheWeb - jeg har bare brukt disse to under Windows).
  3. BIND tools 9.16 (strengt tatt trenger man kun nsupdate.exe)
  4. Konto hos Syse med DNS-administrasjon der

Filer:

add_txt_record.cmd

@echo off

REM ********************************************************************************************
REM * Laget av:        Christer Solstrand Johannessen
REM * E-postadresse: echo 'rznvy1gb:1ybpnyubfgybpnyqbznva@pfw.ab' | tr '1?a-z%#' ' .n-za-m:@'
REM * Dato:        2022-11-24
REM * Beskrivelse:    Skript for å legge til TXT-oppføring i DNS-sone for automatisk fornyelse av
REM *            SSL/TLS-sertifikater fra Let's Encrypt for subdomene. Tilpasset fra Syses DynDNS
REM *            bash shellskript.
REM * Variabler:
REM *             ZONE = example.org - både CertifyTheWeb og WACS sender subdomain.example.org
REM *            som sonenavn, og det funker ikke. Vi må fremdeles fange opp variabeldata, men vi
REM *            trenger ikke bruke den til noe og setter vår egen verdi for at ting skal se profesjonelt
REM *            ut og sånn.
REM *            HOST = hostnavnet som skal legges til: _acme-challenge.subdomain.example.org
REM *            TXTVALUE = tekststrengen for DNS01-verifisering
REM *            KEY = TSIG autentiseringsnøkkel for oppdatering av DynDNS-data. Denne finner man når
REM *            man er innlogget i kontrollpanelet, under DNS-innstillinger for det aktuelle domenet,
REM *            og der nederst under Dynamisk DNS.
REM *            URL til DNS-administrasjon: https://www.syse.no/controlpanel/domain/edit/example.org
REM ********************************************************************************************

REM * Loop gjennom variablene vi får fra kommandolinjeparametrene, og tilordne dem til variabelnavn

for /f "tokens=1-5" %%a in ("%*") do (
   set ZONE=%%b
   set HOST=%%c
   set TXTVALUE=%%d
)

REM * Reset ZONE-variabel
set ZONE=example.org

REM * Autentisering
set SERVER=ns.syse.no
set KEY=SUperHEmmeLIGting

REM * VIKTIG: "echo"-kommandoene må pakkes inn i () slik at alle verdiene beholdes og hele
REM * tekststrengene legges til seg selv og blir sendt til tekstfil (eller vidersendt direkte til nsupdate)
REM * Hvis dette ikke gjøres vil det rett og slett ikke fungere. Videre må teksten som echo'es IKKE
REM * omsluttes av "" (anførselstegn) - dette forårsaker rare feil.
REM *
REM * Skriv (echo) ut nsupdate-kommandoen og stapp den i en tekstfil. Dette fungerte bedre enn å
REM * pipe det direkte til nsupdate siden denne batchfilen blir kjørt fra et program med sitt eget
REM * environment, kjørt som en annen bruker som også har sitt eget environment.
REM *
REM * PASS PÅ Å SPESIFISERE FULL STI TIL ALT ELLERS KOMMER UNIVERSET TIL Å IMPLODERE!
REM * Du har blitt advart.

(echo server %SERVER% & echo zone %ZONE% & echo update add %HOST% 60 TXT %TXTVALUE% & echo send) > c:\temp\add.txt

REM * Kjør nsupdate med vår manuelt spesifiserte sone og vår hemmelige TSIG-nøkkel fra Syse, med
REM * c:\temp\add.txt som kommandofil.
c:\utils\nsupdate -y %ZONE%:%KEY% c:\temp\add.txt

delete_txt_record.cmd

@echo off

REM ********************************************************************************************
REM * Laget av:        Christer Solstrand Johannessen
REM * E-postadresse: echo 'rznvy1gb:1ybpnyubfgybpnyqbznva@pfw.ab' | tr '1?a-z%#' ' .n-za-m:@'
REM * Dato:        2022-11-24
REM * Beskrivelse:    Skript for å fjerne TXT-oppføring i DNS-sone for automatisk fornyelse av
REM *            SSL/TLS-sertifikater fra Let's Encrypt for subdomene.example.org. Tilpasset fra
REM *            Syses DynDNS bash shellskript.
REM * Variabler:
REM *             ZONE = example.org - både CertifyTheWeb og WACS sender subdomain.example.org
REM *            som sonenavn, og det funker ikke. Vi må fremdeles fange opp variabeldata, men vi
REM *            trenger ikke bruke den til noe og setter vår egen verdi for at ting skal se profesjonelt
REM *            ut og sånn.
REM *            HOST = hostnavnet som skal slettes: _acme-challenge.subdomain.example.org
REM *            TXTVALUE = tekststrengen for DNS01-verifisering
REM *            KEY = TSIG autentiseringsnøkkel for oppdatering av DynDNS-data. Denne finner man når
REM *            man er innlogget i kontrollpanelet, under DNS-innstillinger for det aktuelle domenet,
REM *            og der nederst under Dynamisk DNS.
REM *            URL til DNS-administrasjon: https://www.syse.no/controlpanel/domain/edit/example.org
REM ********************************************************************************************REM


REM * Loop gjennom variablene vi får fra kommandolinjeparametrene, og tilordne dem til variabelnavn

for /f "tokens=1-5" %%a in ("%*") do (
   set ZONE=%%b
   set HOST=%%c
   set TXTVALUE=%%d
)

REM * Reset ZONE-variabel
set ZONE=example.org

REM * Autentisering
set SERVER=ns.syse.no
set KEY=SUperHEmmeLIGting

REM * VIKTIG: "echo"-kommandoene må pakkes inn i () slik at alle verdiene beholdes og hele
REM * tekststrengene legges til seg selv og blir sendt til tekstfil (eller vidersendt direkte til nsupdate)
REM * Hvis dette ikke gjøres vil det rett og slett ikke fungere. Videre må teksten som echo'es IKKE
REM * omsluttes av "" (anførselstegn) - dette forårsaker rare feil.
REM *
REM * Skriv (echo) ut nsupdate-kommandoen og stapp den i en tekstfil. Dette fungerte bedre enn å
REM * pipe det direkte til nsupdate siden denne batchfilen blir kjørt fra et program med sitt eget
REM * environment, kjørt som en annen bruker som også har sitt eget environment.
REM *
REM * PASS PÅ Å SPESIFISERE FULL STI TIL ALT ELLERS KOMMER UNIVERSET TIL Å IMPLODERE!
REM * Du har blitt advart.

(echo server %SERVER% & echo zone %ZONE% & echo update delete %HOST% 60 TXT & echo send) > c:\temp\del.txt

REM * Kjør nsupdate med vår manuelt spesifiserte sone og vår hemmelige TSIG-nøkkel fra Syse, med
REM * c:\temp\del.txt as the command file.
c:\utils\nsupdate -y %ZONE%:%KEY% c:\temp\del.txt

restart-apache2.4-webservice.bat

@echo off
net stop apache2.4
net start apache2.4