Ka automatizaciji izdavanja SSL-a

Vrlo često moramo raditi sa SSL certifikatima. Prisjetimo se procesa kreiranja i instaliranja certifikata (u općenitom slučaju za većinu).

  • Pronađite provajdera (sajt na kojem možemo kupiti SSL).
  • Generirajte CSR.
  • Pošaljite ga provajderu.
  • Potvrdite vlasništvo nad domenom.
  • Nabavite sertifikat.
  • Konvertujte sertifikat u željeni oblik (opciono). Na primjer, od pem do PKCS #12.
  • Instalirajte certifikat na web server.

Relativno brzo, lako i razumljivo. Ova opcija je sasvim prikladna ako imamo najviše desetak projekata. Šta ako ih ima više, a imaju najmanje tri okruženja? Klasični razvoj - postavljanje - produkcija. U ovom slučaju vrijedi razmisliti o automatizaciji ovog procesa. Predlažem da uđemo malo dublje u problem i pronađemo rješenje koje će dodatno minimizirati vrijeme utrošeno na kreiranje i održavanje certifikata. Članak će sadržavati analizu problema i mali vodič za ponavljanje.

Unaprijed ću napraviti rezervaciju: glavna specijalizacija naše kompanije je .net, a samim tim i IIS i drugi šrafovi. Stoga će ACME klijent i sve radnje za njega također biti opisani u smislu korištenja prozora.

Za koga je relevantno i neki pozadinski podaci

Kompanija K koju zastupa autor. URL (na primjer): company.tld

Projekat X je jedan od naših projekata u kojem sam došao do zaključka da još uvijek moramo ići ka maksimalnoj uštedi vremena pri radu sa certifikatima. Ovaj projekat ima četiri okruženja: dev, test, staging i production. Dev i test su na našoj strani, inscenacija i produkcija su na strani klijenta.

Karakteristika projekta je da ima veliki broj modula koji su dostupni kao poddomeni.

Odnosno, imamo sledeću sliku:

Dev
test
Staging
proizvodnja

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

Za proizvodnju se koristi kupljeni wildcard certifikat, ovdje nema pitanja. Ali pokriva samo prvi nivo poddomena. Prema tome, ako postoji certifikat za *.projectX.tld, onda će on raditi za staging.projectX.tld, ali ne i za module1.staging.projectX.tld. Ne želim da kupujem odvojeno.

I to samo na primjeru jednog projekta jedne kompanije. I projekat, naravno, nije sam.

Opšti razlozi za rješavanje ovog problema izgledaju otprilike ovako:

  • Nedavno Google je predložio smanjenje maksimalnog perioda važenja SSL certifikata. Sa svim posledicama.
  • Olakšati proces izdavanja i održavanja SSL-a za interne potrebe projekata i kompanije u cjelini.
  • Centralizovano skladištenje zapisa sertifikata, čime se delimično rešava problem validacije domena korišćenjem DNS-a i naknadnog automatskog obnavljanja, a rešava i problem poverenja klijenata. Ipak, CNAME je pouzdaniji na serveru partnerske/izvršne kompanije nego na resursu treće strane.
  • Pa, konačno, u ovom slučaju, fraza „bolje imati nego ne imati“ savršeno se uklapa.

Odabir SSL provajdera i pripremni koraci

Od dostupnih opcija za besplatne SSL sertifikate, razmatrani su cloudflare i letsencrypt. DNS za ovaj (i neke druge projekte) hostuje cloudflare, ali ja nisam ljubitelj korištenja njihovih certifikata. Stoga je odlučeno da se koristi letsencrypt.
Da biste kreirali zamjenski SSL certifikat, morate potvrditi vlasništvo nad domenom. Ova procedura podrazumeva kreiranje nekog DNS zapisa (TXT ili CNAME), sa njegovom naknadnom verifikacijom prilikom izdavanja sertifikata. Linux ima uslužni program − certbot, što vam omogućava da djelimično (ili potpuno za neke DNS provajdere) automatizujete ovaj proces. Za Windows isto od pronađeno i testirano opcije za ACME klijente na koje sam se odlučio WinACME.

I zapis za domenu je kreiran, idemo na kreiranje certifikata:

Ka automatizaciji izdavanja SSL-a

Zanima nas posljednji zaključak, odnosno dostupne opcije za provjeru vlasništva nad domenom za izdavanje džoker certifikata:

  1. Ručno kreiranje DNS zapisa (automatsko ažuriranje nije podržano)
  2. Kreiranje DNS zapisa pomoću acme-dns servera (za više detalja pogledajte ovdje.
  3. Kreiranje DNS zapisa koristeći vlastitu skriptu (slično kao dodatak cloudflare za certbot).

Na prvi pogled, treća tačka je sasvim prikladna, ali ako DNS provajder ne podržava ovu funkcionalnost? I potreban nam je opšti slučaj. A generalni slučaj su CNAME zapisi, svi ih podržavaju. Stoga se zaustavljamo na tački 2 i idemo na konfiguraciju našeg ACME-DNS servera.

Postavljanje ACME-DNS servera i proces izdavanja certifikata

Na primjer, napravio sam 2nd.pp.ua domenu i koristit ću je u budućnosti.

Obavezni uslov za ispravan rad servera je kreiranje NS i A zapisa za njegov domen. I prvi neugodan trenutak na koji sam naišao je da cloudflare (barem u besplatnom modu) ne dozvoljava da istovremeno kreirate NS i A zapis za isti host. Nije da je to problem, ali u vezi je moguće. Podrška je odgovorila da njihov panel to ne dozvoljava. Nema veze, napravimo dva unosa:

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

U ovoj fazi, trebali bismo riješiti domaćina acmens.2nd.pp.ua.

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

Ali acme.2nd.pp.ua neće riješiti, jer DNS server koji ga opslužuje još nije pokrenut.

Zapisi su napravljeni, idemo na podešavanje i pokretanje ACME-DNS servera. Živeću to na ubuntu serveru docker kontejner, ali ga možete pokrenuti bilo gdje gdje postoji golang. Windows je također u redu, ali ja i dalje preferiram Linux server.

Kreirajte potrebne direktorije i datoteke:

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

Koristimo vim sa vašim omiljenim uređivačem teksta i zalijepimo uzorak u config.cfg konfiguracija.

Za uspješan rad dovoljno je ispraviti opće i api odjeljke:

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

Također, opciono, kreirajte datoteku docker-compose u glavnom direktoriju usluge:

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

Spreman. Možeš da trčiš.

$ docker-compose up -d

U ovoj fazi, domaćin bi trebao početi rješavati acme.2nd.pp.ua, i pojavljuju 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

Ako se ovo ne pojavi - docker logs -f <container_name> da pomognem, dobro, zapisnici su prilično čitljivi.

Možemo započeti kreiranje certifikata. Otvorite powershell kao administrator i pokrenite winacme. Zainteresovani smo za izbore:

  • M: Kreirajte novi certifikat (pune opcije)
  • 2: Ručni unos
  • 2: [dns-01] Kreirajte verifikacione zapise sa acme-dns (https://github.com/joohoi/acme-dns)
  • Na pitanje o linku do ACME-DNS servera, unesite URL kreiranog servera (https) kao odgovor. URL acme-dns servera: https://acme.2nd.pp.ua

Kao odgovor, klijent izdaje zapis koji treba dodati postojećem DNS serveru (jednokratna procedura):

[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.

Ka automatizaciji izdavanja SSL-a

Kreiramo potreban unos i uvjeravamo se da je ispravno kreiran:

Ka automatizaciji izdavanja SSL-a

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

Potvrđujemo da smo kreirali traženi unos u winacme-u i nastavljamo proces kreiranja certifikata:

Ka automatizaciji izdavanja SSL-a

Opisano je kako koristiti certbot kao klijenta ovdje.

Ovim je završen proces kreiranja certifikata, možete ga instalirati na web server i koristiti. Ako prilikom kreiranja certifikata kreirate i zadatak u planeru, u budućnosti će se proces ažuriranja certifikata odvijati automatski.

izvor: www.habr.com

Dodajte komentar