Certbot rapporterer en vellykket fornyelse, filerne på disken har nye datoer, og klienterne møder stadig den gamle identitet. SoftEther holder sit SSL-servercertifikat i sin egen konfiguration på serverniveau, så en ny fil på disken ændrer intet, før bladcertifikatet og dets nøgle er importeret. Sekvensen nedenfor dækker én manuel import, en indpakning der kører efter hver fornyelse, og et tjek der læser, hvad listeneren faktisk præsenterer. Hvert trin efterlader beviser, du kan sammenligne efter næste fornyelse.

En fornyet fil ændrer ikke serverens identitet

Udstedelse og implementering er separate begivenheder med separate fejltilstande. ACME-klienten skriver filer i en lineage-mappe og registrerer succes; SoftEther bliver ved med at bruge det certifikat, der sidst blev indlæst i konfigurationen. En nul-exitstatus beskriver derfor filerne, ikke tjenesten, og de to kan være uenige, så længe ingen kigger. Behandl importen som implementeringstrinnet og fornyelsen som dens input.

Den forskel forklarer også den forvirrende halvfejl: det gamle certifikat virker indtil sin udløbsdato, så intet ser ødelagt ud i starten. Når det udløber, fejler alle klienter på én gang, hvilket ligner et nedbrud snarere end et sprunget implementeringstrin. At tjekke den præsenterede identitet efter hver fornyelse gør den overraskelse til en rutinemæssig observation.

Vælg den udfordring, der passer til listeneren

Certifikatet skal navngive den vært, klienterne verificerer, så brug det offentlige DNS-navn frem for en intern etiket eller en adresse. HTTP-01 kræver, at udfordringen besvares på port 80 et øjeblik, hvilket er en midlertidig listener og aldrig en grund til at flytte SoftEthers egen port. DNS-01 beviser kontrol gennem en post og kræver slet ingen indgående HTTP.

Uovervåget fornyelse betyder en automatiseret DNS-integration med legitimationsoplysninger begrænset til én zone, ikke en TXT-post skrevet i hånden hver anden måned. Et wildcard ændrer udfordringstypen, ikke behovet for den automatisering. Beslut det, før det første certifikat findes, for at skifte udfordringstype senere betyder at røre klientkonfigurationen og firewalle sammen.

Hold artefakterne adskilt, mens du er her. Bladcertifikatet og mellemcertifikaterne kommer som separate filer og som én kombineret kædefil, den private nøgle er igen separat, og importen kræver kæden med dens matchende nøgle frem for et offentligt certifikat alene.

Importér kæden på serverniveau

Tag en sikkerhedskopi af serverkonfigurationen, og bekræft at du stadig kan nå administrationsgrænsefladen, før du rører certifikatet. Forbind som serveradministrator frem for Virtual Hub-administrator, fordi certifikatet hører til serverobjektet. Indlæs derefter kæden og nøglen med absolut sti, fra filer som den konto, der kører kommandoen, kan læse. Bemærk at stierne er absolutte, fordi kommandoen opløser dem fra arbejdsmappen i den proces, der kørte vpncmd:

ServerCertSet /LOADCERT:/etc/letsencrypt/live/vpn.example.com/fullchain.pem /LOADKEY:/etc/letsencrypt/live/vpn.example.com/privkey.pem

Læs kommandoens output i stedet for at antage succes, og læs derefter kæden tilbage i stedet for at stole på den fil, du gav den. Grænsen mellem builds, der importerer en hel PEM-pakke, og builds, der kun tager det første certifikat, er ikke dokumenteret ét sted, så tjekket er det, der afgør det for det build, du har foran dig. Tæl de certifikater, listeneren præsenterer; et bladcertifikat uden mellemcertifikater er signaturen på en importør, der kun forbrugte den første blok.

Hold den importerede nøgle læsbar kun for den konto, der kører serveren, og hold administrationsadgangskoden ude af shell-historikken. Ved denne første import skal du skrive adgangskoden ved prompten i stedet for at give den som kommandoparameter. De to vaner koster intet og fjerner den mest almindelige måde, hvorpå en certifikatimplementering lækker noget, den skulle beskytte. Gør det før den første import, ikke efter.

Hægt implementeringen på, ikke fornyelsen

Når den manuelle import virker, skal du lægge præcis de trin i en lille indpakning og kalde den fra ACME-klienten efter en vellykket fornyelse. Certbot sætter RENEWED_LINEAGE og RENEWED_DOMAINS til hooket, så indpakningen kan handle på ét certifikat på en maskine, der administrerer flere. Filtrér på lineage frem for at reagere på hver fornyelse på værten. Indpakningen er implementeringskode, der kører med serverens rettigheder, så gennemgå den som ethvert andet script i den position.

certbot renew --deploy-hook /usr/local/sbin/softether-deploy.sh

Et hook, der kører uovervåget, har brug for sit eget beskyttede lager af legitimationsoplysninger og et fejlsignal, der når et menneske. Hvis udstedelsen lykkes, og importen fejler, skal du prøve importen igen i stedet for at anmode om et nyt certifikat, fordi en anden anmodning skjuler implementeringsfejlen bag en ny fil. Certbots dokumentation om fornyelse er klar over, at en kørsel, der ikke opdaterer noget, er et normalt resultat, så hooket er det, der skelner de to.

Sammenlign den præsenterede kæde med filen

Læs listeneren, ikke disken. Forbind til den klientvendte port med det servernavn, klienterne bruger, og sammenlign derefter fingeraftrykket og den leverede kæde med den lineage, hooket installerede. To kommandoer dækker det, og den første viser også, om mellemcertifikater overhovedet ankommer:

openssl s_client -connect vpn.example.com:443 -servername vpn.example.com -showcerts </dev/null 2>/dev/null | grep -c 'BEGIN CERTIFICATE'
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates -fingerprint -sha256

Opret derefter en ny klientforbindelse, fordi sessioner etableret før importen blev autentificeret mod den tidligere identitet og beviser intet om den nye. Hvis klienter pinner det gamle bladcertifikat, har de brug for en koordineret opdatering, selv når den offentlige kæde er gyldig, og den opgave hører i samme runbook som fornyelsen. En omvendt proxy foran tjenesten kan præsentere et godt certifikat, mens VPN-listeneren stadig holder det gamle, og derfor skal tjekket navngive den port, klienterne faktisk når. Notér fingeraftrykket ved fornyelsesdatoen, så den næste sammenligning er et tjek og ikke en handling fra hukommelsen.

Relaterede artikler