Směrem k automatizaci vydávání SSL

Dost často musíme pracovat s SSL certifikáty. Vzpomeňme na proces vytvoření a instalace certifikátu (obecně pro většinu).

  • Najděte poskytovatele (stránku, kde můžeme zakoupit SSL).
  • Generovat CSR.
  • Pošlete to poskytovateli.
  • Potvrďte vlastnictví domény.
  • Získejte certifikát.
  • Převeďte certifikát do požadované podoby (volitelné). Například z pem na PKCS #12.
  • Nainstalujte certifikát na webový server.

Relativně rychlé, snadné a srozumitelné. Tato možnost je docela vhodná, pokud máme maximálně tucet projektů. Co když jich je víc a mají alespoň tři prostředí? Klasický vývoj - inscenace - produkce. V tomto případě stojí za to přemýšlet o automatizaci tohoto procesu. Navrhuji jít trochu hlouběji do problému a najít řešení, které dále minimalizuje čas strávený vytvářením a údržbou certifikátů. Článek bude obsahovat rozbor problému a malý návod na opakování.

Udělám rezervaci předem: hlavní specializací naší společnosti je .net, a tedy IIS a další související se šrouby. Proto bude ACME klient a všechny akce pro něj popsány také z hlediska používání oken.

Pro koho je to relevantní a nějaká podkladová data

Firma K zastoupená autorem. URL (například): company.tld

Projekt X je jedním z našich projektů, u kterého jsem došel k závěru, že je stále potřeba směřovat k maximální úspoře času při práci s certifikáty. Tento projekt má čtyři prostředí: vývojové, testovací, pracovní a produkční. Vývoj a testování jsou na naší straně, inscenace a produkce na straně klienta.

Charakteristickým rysem projektu je, že má velké množství modulů, které jsou dostupné jako subdomény.

To znamená, že máme následující obrázek:

dev
test
Staging
Výroba

projectX.dev.company.tld
projectX.test.company.tld
staging.projectX.tld
projectX.tld

module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
modul1.projektX.tld

module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
modul2.projektX.tld

...
...
...
...

moduleN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
moduleN.projectX.tld

Pro výrobu se používá zakoupený wildcard certifikát, zde nejsou žádné dotazy. Pokrývá ale pouze první úroveň subdomény. Pokud tedy existuje certifikát pro *.projectX.tld, bude fungovat pro staging.projectX.tld, ale ne pro module1.staging.projectX.tld. Nechci kupovat zvlášť.

A to pouze na příkladu jednoho projektu jedné firmy. A projekt samozřejmě není sám.

Obecné důvody pro řešení tohoto problému vypadají asi takto:

  • Nedávno Google navrhl zkrátit maximální dobu platnosti certifikátů SSL. Se všemi důsledky.
  • Usnadnit proces vydávání a udržování SSL pro interní potřeby projektů a společnosti jako celku.
  • Centralizované úložiště záznamů certifikátů, které částečně řeší problém ověřování domény pomocí DNS a následné automatické obnovy a řeší i otázku důvěry klientů. CNAME je však důvěryhodnější na serveru partnerské/prováděcí společnosti než na zdroji třetí strany.
  • No, konečně, v tomto případě dokonale sedí fráze „lepší mít, než nemít“.

Výběr poskytovatele SSL a přípravné kroky

Z dostupných možností pro bezplatné SSL certifikáty byly zvažovány cloudflare a letsencrypt. DNS pro tento (a některé další projekty) je hostován cloudflare, ale nejsem příznivcem používání jejich certifikátů. Proto bylo rozhodnuto použít letsencrypt.
Pro vytvoření SSL certifikátu se zástupným znakem je nutné ověřit vlastnictví domény. Tento postup zahrnuje vytvoření DNS záznamu (TXT nebo CNAME) a ​​jeho následné ověření při vydání certifikátu. Linux existuje nástroj - certbot, což vám umožňuje tento proces částečně (nebo u některých poskytovatelů DNS zcela) automatizovat. Pro Windows stejné od nalezeno a otestováno možnosti pro klienty ACME, pro které jsem se rozhodl WinACME.

A záznam pro doménu byl vytvořen, přejdeme k vytvoření certifikátu:

Směrem k automatizaci vydávání SSL

Zajímá nás poslední závěr, a to dostupné možnosti ověření vlastnictví domény pro vydání zástupného certifikátu:

  1. Ruční vytváření DNS záznamů (automatická aktualizace není podporována)
  2. Vytváření DNS záznamů pomocí serveru acme-dns (další podrobnosti viz zde.
  3. Vytváření DNS záznamů pomocí vlastního skriptu (obdoba pluginu cloudflare pro certbot).

Na první pohled je třetí bod docela vhodný, ale pokud poskytovatel DNS tuto funkcionalitu nepodporuje? A potřebujeme obecný případ. A obecným případem jsou záznamy CNAME, všichni je podporují. Proto se zastavíme u bodu 2 a přejdeme ke konfiguraci našeho serveru ACME-DNS.

Nastavení serveru ACME-DNS a proces vydání certifikátu

Vytvořil jsem například doménu 2nd.pp.ua a budu ji používat v budoucnu.

Povinný požadavek pro správný chod serveru je vytvoření NS a A záznamů pro jeho doménu. A prvním nepříjemným momentem, se kterým jsem se setkal, je, že cloudflare (alespoň ve volném režimu) vám neumožňuje současně vytvořit záznam NS a A pro stejného hostitele. Ne že by to byl problém, ale ve vazbě to možné je. Podpora odpověděla, že jejich panel to neumožňuje. Nevadí, vytvoříme dva záznamy:

acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.

V této fázi bychom měli vyřešit hostitele acmens.2nd.pp.ua.

$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data

Ale acme.2nd.pp.ua nevyřeší, protože server DNS, který jej obsluhuje, ještě není spuštěn.

Záznamy jsou vytvořeny, pojďme k nastavení a spuštění serveru ACME-DNS. Budu ho hostovat na ubuntu server v přístavní dělník kontejner, ale můžete ho spustit kdekoli, kde je k dispozici golang. Windows Tohle je taky docela vhodné, ale pořád preferuji Linux server.

Vytvořte potřebné adresáře a soubory:

$ mkdir config
$ mkdir data
$ touch config/config.cfg

Použijme vim s vaším oblíbeným textovým editorem a vložte ukázku do config.cfg konfigurace.

Pro úspěšnou práci stačí opravit obecné a api sekce:

[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua" 
nsadmin = "admin.2nd.pp.ua" 
records = 
    "acme.2nd.pp.ua. A 35.237.128.147",
    "acme.2nd.pp.ua. NS acmens.2nd.pp.ua.",                                                                                                                                                                                                  ]
...
[api]
...
tls = "letsencrypt"
…

Volitelně také vytvořte soubor docker-compose v hlavním adresáři služby:

version: '3.7'
services:
  acmedns:
    image: joohoi/acme-dns:latest
    ports:
      - "443:443"
      - "53:53"
      - "53:53/udp"
      - "80:80"
    volumes:
      - ./config:/etc/acme-dns:ro
      - ./data:/var/lib/acme-dns

Připraveno. Můžete běžet.

$ docker-compose up -d

V této fázi by měl hostitel začít řešit acme.2nd.pp.uaa zobrazí se 404 na https://acme.2nd.pp.ua

$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.

$ curl https://acme.2nd.pp.ua
404 page not found

Pokud se toto neobjeví - docker logs -f <container_name> abych pomohl, dobrý, protokoly jsou docela čitelné.

Můžeme začít vytvářet certifikát. Otevřete powershell jako správce a spusťte winacme. Volby nás zajímají:

  • M: Vytvořit nový certifikát (plné možnosti)
  • 2: Ruční zadání
  • 2: [dns-01] Vytvořte ověřovací záznamy pomocí acme-dns (https://github.com/joohoi/acme-dns)
  • Až budete dotázáni na odkaz na server ACME-DNS, zadejte jako odpověď adresu URL vytvořeného serveru (https). Adresa URL serveru acme-dns: https://acme.2nd.pp.ua

V reakci klient vydá záznam, který je třeba přidat na existující server DNS (jednorázový postup):

[INFO] Creating new acme-dns registration for domain 1nd.pp.ua

Domain:              1nd.pp.ua
Record:               _acme-challenge.1nd.pp.ua
Type:                   CNAME
Content:              c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note:                   Some DNS control panels add the final dot automatically.
                           Only one is required.

Směrem k automatizaci vydávání SSL

Vytvoříme potřebný záznam a ujistíme se, že byl vytvořen správně:

Směrem k automatizaci vydávání SSL

$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.

Potvrzujeme, že jsme vytvořili požadovaný záznam ve winacme, a pokračujeme v procesu vytváření certifikátu:

Směrem k automatizaci vydávání SSL

Je popsáno, jak používat certbota jako klienta zde.

Tím je proces vytvoření certifikátu dokončen, můžete jej nainstalovat na webový server a používat. Pokud při vytváření certifikátu vytvoříte také úlohu v plánovači, pak v budoucnu bude proces aktualizace certifikátu probíhat automaticky.

Zdroj: www.habr.com

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster