Smerom k automatizácii vydávania SSL

Pomerne často musíme pracovať s SSL certifikátmi. Spomeňme si na proces vytvárania a inštalácie certifikátu (vo všeobecnom prípade pre väčšinu).

  • Nájdite poskytovateľa (stránku, kde si môžeme kúpiť SSL).
  • Generovať CSR.
  • Pošlite to svojmu poskytovateľovi.
  • Overte vlastníctvo domény.
  • Získajte certifikát.
  • Preveďte certifikát do požadovanej podoby (voliteľné). Napríklad z pem na PKCS #12.
  • Nainštalujte certifikát na webový server.

Relatívne rýchle, nie zložité a zrozumiteľné. Táto možnosť je celkom vhodná, ak máme maximálne desať projektov. Čo ak ich je viac a majú aspoň tri prostredia? Klasický dev - inscenácia - produkcia. V tomto prípade stojí za to premýšľať o automatizácii tohto procesu. Navrhujem ponoriť sa do problému trochu hlbšie a nájsť riešenie, ktoré ešte viac minimalizuje čas strávený vytváraním a údržbou certifikátov. Článok bude obsahovať rozbor problému a malý návod na zopakovanie.

Dovoľte mi urobiť rezerváciu vopred: hlavnou špecializáciou našej spoločnosti je .net, a teda IIS a ďalšie produkty súvisiace so systémom Windows. Preto bude ACME klient a všetky úkony k nemu popísané aj z pohľadu používania Windows.

Pre koho je to relevantné a nejaké počiatočné údaje

Spoločnosť K zastúpená autorom. URL (napríklad): company.tld

Projekt X je jeden z našich projektov, pri práci na ktorom som dospel k záveru, že stále treba smerovať k maximálnej úspore času pri práci s certifikátmi. Tento projekt má štyri prostredia: dev, test, staging a production. Vývoj a test sú na našej strane, inscenácia a produkcia na strane klienta.

Zvláštnosťou projektu je, že má veľké množstvo modulov, ktoré sú dostupné ako subdomény.

To znamená, že máme nasledujúci obrázok:

dev
test
Predstavovať
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
module1.projectX.tld

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

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

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

Na výrobu sa používa zakúpený divoký certifikát, tu nevznikajú žiadne otázky. Pokrýva však iba prvú úroveň subdomény. Ak teda existuje certifikát pre *.projectX.tld, potom bude fungovať pre staging.projectX.tld, ale nie pre module1.staging.projectX.tld. Ale nejako sa mi nechce kupovať samostatnú.

A to len na príklade jedného projektu jednej firmy. A, samozrejme, existuje viacero projektov.

Bežné dôvody, prečo by sa mali všetci zaoberať týmto problémom, vyzerajú asi takto:

  • Nedávno Google navrhol skrátenie maximálnej doby platnosti certifikátov SSL. So všetkými dôsledkami.
  • Uľahčiť proces vydávania a udržiavania SSL pre interné potreby projektov a spoločnosti ako celku.
  • Centralizované ukladanie záznamov certifikátov, ktoré čiastočne rieši problém overenia domény pomocou DNS a následného automatického obnovovania a rieši aj otázku dôvery klientov. Napriek tomu je CNAME na serveri partnerskej/výkonnej spoločnosti dôveryhodnejšie ako na zdroji tretej strany.
  • Nakoniec, v tomto prípade veta „je lepšie mať, ako nemať“ dokonale sedí.

Výber poskytovateľa SSL a prípravné kroky

Medzi dostupnými možnosťami bezplatných certifikátov SSL boli zvážené cloudflare a letsencrypt. DNS pre tento (a niektoré ďalšie projekty) je hostený cloudflare, ale nie som fanúšikom používania ich certifikátov. Preto bolo rozhodnuté použiť letsencrypt.
Ak chcete vytvoriť certifikát SSL so zástupným znakom, musíte potvrdiť vlastníctvo domény. Tento postup zahŕňa vytvorenie nejakého záznamu DNS (TXT alebo CNAME) a ​​jeho následné overenie pri vydávaní certifikátu. Linux má nástroj - certbot, ktorá umožňuje čiastočne (alebo úplne u niektorých poskytovateľov DNS) automatizovať tento proces. Pre Windows od nájdené a overené Možnosti klientov ACME, na ktorých som sa dohodol WinACME.

A záznam pre doménu bol vytvorený, prejdime k vytvoreniu certifikátu:

Smerom k automatizácii vydávania SSL

Zaujíma nás posledný záver, konkrétne dostupné možnosti potvrdenia vlastníctva domény na vydanie certifikátu so zástupným znakom:

  1. Vytvorte záznamy DNS manuálne (automatická aktualizácia nie je podporovaná)
  2. Vytváranie DNS záznamov pomocou servera acme-dns (môžete si prečítať viac o tu.
  3. Vytváranie DNS záznamov pomocou vlastného skriptu (podobne ako plugin cloudflare pre certbot).

Tretí bod je na prvý pohľad celkom vhodný, ale čo ak poskytovateľ DNS túto funkcionalitu nepodporuje? Potrebujeme však všeobecný prípad. A všeobecným prípadom sú záznamy CNAME, pretože ich podporuje každý. Preto sa zastavíme v bode 2 a prejdeme na konfiguráciu nášho servera ACME-DNS.

Nastavenie servera ACME-DNS a proces vydania certifikátu

Napríklad som vytvoril doménu 2nd.pp.ua a budem ju používať v budúcnosti.

Povinná požiadavka Pre správne fungovanie servera je potrebné vytvoriť NS a A záznamy pre jeho doménu. A prvým nepríjemným momentom, s ktorým som sa stretol, je, že cloudflare (aspoň v režime bezplatného používania) vám neumožňuje súčasne vytvoriť záznam NS a A pre toho istého hostiteľa. Nie, že by to bol problém, ale vo väzbe je to možné. Podpora odpovedala, že ich panel to neumožňuje. Žiadny problém, vytvorme dva záznamy:

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

V tejto fáze by to mal náš hostiteľ vyriešiť acmens.2nd.pp.ua.

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

a tu acme.2nd.pp.ua nevyrieši to, pretože server DNS, ktorý ho obsluhuje, ešte nie je spustený.

Záznamy sú vytvorené, pristúpime k nastaveniu a spusteniu ACME-DNS servera. Bude žiť na mojom ubuntu serveri prístavný robotník kontajner, ale môžete ho spustiť kdekoľvek, kde je dostupný golang. Windows je tiež celkom vhodný, ale stále preferujem linuxový server.

Vytvorte potrebné adresáre a súbory:

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

Použime vim s vaším obľúbeným textovým editorom a vložte vzorku do config.cfg konfigurácia.

Pre úspešnú prevádzku stačí opraviť všeobecné a api časti:

[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"
…

V prípade potreby tiež vytvoríme súbor docker-compose v hlavnom adresári 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

Pripravený. Môžete to spustiť.

$ docker-compose up -d

V tejto fáze by mal hostiteľ začať riešiť acme.2nd.pp.uaa zobrazí sa 404 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

Ak sa toto neobjaví - docker logs -f <container_name> pomôcť, našťastie, denníky sú celkom čitateľné.

Môžeme začať vytvárať certifikát. Otvorte powershell ako správca a spustite winacme. Máme záujem o tieto voľby:

  • M: Vytvoriť nový certifikát (úplné možnosti)
  • 2: Manuálne zadávanie
  • 2: [dns-01] Vytvorte overovacie záznamy pomocou acme-dns (https://github.com/joohoi/acme-dns)
  • Pri otázke o prepojení na server ACME-DNS zadajte do odpovede URL vytvoreného servera (https). Adresa URL servera acme-dns: https://acme.2nd.pp.ua

Pri otvorení klient vydá záznam, ktorý je potrebné pridať na existujúci server DNS (jednorazový 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.

Smerom k automatizácii vydávania SSL

Vytvoríme potrebný záznam a uistíme sa, že bol vytvorený správne:

Smerom k automatizácii vydávania SSL

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

Potvrdzujeme, že sme vytvorili požadovaný záznam vo winacme a pokračujeme v procese vytvárania certifikátu:

Smerom k automatizácii vydávania SSL

Je popísané, ako používať certbota ako klienta tu.

Tým je proces vytvorenia certifikátu dokončený, môžete ho nainštalovať na webový server a používať. Ak pri vytváraní certifikátu vytvoríte aj úlohu v plánovači, tak v budúcnosti bude proces obnovy certifikátu prebiehať automaticky.

Zdroj: hab.com

Pridať komentár