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 . 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 - , což vám umožňuje tento proces částečně (nebo u některých poskytovatelů DNS zcela) automatizovat. Pro Windows stejné od možnosti pro klienty ACME, pro které jsem se rozhodl .
A záznam pro doménu byl vytvořen, přejdeme k vytvoření certifikátu:

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:
- Ruční vytváření DNS záznamů (automatická aktualizace není podporována)
- Vytváření DNS záznamů pomocí serveru acme-dns (další podrobnosti viz .
- 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.
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 dataAle 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 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.cfgPoužijme vim s vaším oblíbeným textovým editorem a vložte ukázku do config.cfg .
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-dnsPřipraveno. Můžete běžet.
$ docker-compose up -dV 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 foundPokud 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 ()
- 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:
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.
Vytvoříme potřebný záznam a ujistíme se, že byl vytvořen správně:
![]()
$ 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:

Je popsáno, jak používat certbota jako klienta .
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
