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/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:
Forutsetninger for at dette skal fungere:
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