Prema automatizaciji izdavanja SSL-a

Vrlo često moramo raditi sa SSL certifikatima. Prisjetimo se procesa izrade i instaliranja certifikata (za većinu općenito).

  • Pronađite pružatelja usluga (stranica na kojoj možemo kupiti SSL).
  • Generirajte CSR.
  • Pošaljite ga davatelju usluga.
  • Potvrdite vlasništvo nad domenom.
  • Dobiti certifikat.
  • Pretvorite certifikat u željeni oblik (nije obavezno). Na primjer, od pem do PKCS #12.
  • Instalirajte certifikat na web poslužitelju.

Relativno brzo, jednostavno i razumljivo. Ova je opcija sasvim prikladna ako imamo najviše desetak projekata. Što ako ih je više, a imaju barem tri okruženja? Klasični razvoj - inscenacija - 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 smanjiti vrijeme utrošeno na izradu i održavanje certifikata. Članak će sadržavati analizu problema i mali vodič za ponavljanje.

Unaprijed ću rezervirati: glavna specijalizacija naše tvrtke je .net, a time i IIS i drugi povezani s vijcima. Stoga će ACME klijent i sve radnje za njega također biti opisani u smislu korištenja prozora.

Za koga je to relevantno i neki pozadinski podaci

Tvrtka K koju zastupa autor. URL (na primjer): tvrtka.tld

Projekt X je jedan od naših projekata u kojem sam došao do zaključka da ipak treba ići ka maksimalnoj uštedi vremena u radu s certifikatima. Ovaj projekt ima četiri okruženja: dev, test, staging i production. Dev i test su na našoj strani, staging i produkcija su na strani klijenta.

Posebnost projekta je što ima velik broj modula koji su dostupni kao poddomene.

Odnosno, imamo sljedeću sliku:

dev
test
skele
Proizvodnja

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

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

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

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

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

Za proizvodnju se koristi kupljeni wildcard certifikat, ovdje nema pitanja. Ali pokriva samo prvu razinu poddomene. Sukladno tome, ako postoji certifikat za *.projectX.tld, tada će raditi za staging.projectX.tld, ali ne i za module1.staging.projectX.tld. Ne želim kupiti zasebno.

I to samo na primjeru jednog projekta jedne tvrtke. I projekt, naravno, nije usamljen.

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

  • Nedavno Google je predložio smanjenje maksimalnog roka valjanosti SSL certifikata. Sa svim posljedicama.
  • Olakšati proces izdavanja i održavanja SSL-a za interne potrebe projekata i tvrtke u cjelini.
  • Centralizirana pohrana zapisa certifikata, čime se djelomično rješava problem provjere valjanosti domene pomoću DNS-a i kasnije automatske obnove, a također se rješava i pitanje povjerenja klijenta. Unatoč tome, CNAME je pouzdaniji na poslužitelju tvrtke partnera/izvršitelja nego na resursu treće strane.
  • Pa, konačno, u ovom slučaju, izraz "bolje imati nego nemati" savršeno odgovara.

Odabir SSL davatelja i pripremni koraci

Od dostupnih opcija za besplatne SSL certifikate razmatrani su cloudflare i letsencrypt. DNS za ovaj (i neke druge projekte) hostira cloudflare, ali ja nisam obožavatelj korištenja njihovih certifikata. Stoga je odlučeno koristiti letsencrypt.
Za izradu zamjenskog SSL certifikata morate potvrditi vlasništvo nad domenom. Ovaj postupak uključuje kreiranje nekog DNS zapisa (TXT ili CNAME), uz njegovu naknadnu provjeru prilikom izdavanja certifikata. Linux ima uslužni program − certbot, koji vam omogućuje da djelomično (ili potpuno za neke DNS pružatelje) automatizirate 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, prijeđimo na izradu certifikata:

Prema automatizaciji izdavanja SSL-a

Zanima nas posljednji zaključak, odnosno dostupne opcije za provjeru vlasništva domene za izdavanje zamjenskog certifikata:

  1. Ručno stvaranje DNS zapisa (automatsko ažuriranje nije podržano)
  2. Stvaranje DNS zapisa pomoću acme-dns poslužitelja (za više detalja pogledajte ovdje.
  3. Stvaranje DNS zapisa pomoću vlastite skripte (slično dodatku cloudflare za certbot).

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

ACME-DNS postavljanje poslužitelja i proces izdavanja certifikata

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

Obavezan zahtjev za ispravan rad poslužitelja je kreiranje NS i A zapisa za njegovu domenu. I prvi neugodan trenutak s kojim sam se susreo je taj da vam Cloudflare (barem u besplatnom načinu rada) ne dopušta istovremeno stvaranje NS i A zapisa za isti host. Nije da je to problem, ali u vezanju je moguće. Podrška je odgovorila da njihov panel to ne dopušta. Nije bitno, kreirajmo 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 host 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 poslužitelj koji ga opslužuje još nije pokrenut.

Zapisi su napravljeni, idemo na postavljanje i pokretanje ACME-DNS poslužitelja. Živjet ću na ubuntu serveru lučki radnik spremnik, ali možete ga pokrenuti bilo gdje gdje postoji golang. Windows je također dobar, ali još uvijek preferiram Linux poslužitelj.

Stvorite potrebne direktorije i datoteke:

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

Upotrijebimo vim s 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 dijelove:

[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, opcionalno, 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žete trčati.

$ 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> u pomoć, dobro, dnevnici su prilično čitljivi.

Možemo započeti s izradom certifikata. Otvorite powershell kao administrator i pokrenite winacme. Zanimaju nas izbori:

  • M: Stvori novi certifikat (pune mogućnosti)
  • 2: Ručni unos
  • 2: [dns-01] Stvorite verifikacijske zapise s acme-dns (https://github.com/joohoi/acme-dns)
  • Na pitanje o poveznici na ACME-DNS poslužitelj, unesite URL kreiranog poslužitelja (https) kao odgovor. URL acme-dns poslužitelja: https://acme.2nd.pp.ua

Kao odgovor, klijent izdaje zapis koji treba dodati na postojeći DNS poslužitelj (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.

Prema automatizaciji izdavanja SSL-a

Stvaramo potreban unos i uvjeravamo se da je ispravno kreiran:

Prema 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 winacmeu i nastavljamo proces izrade certifikata:

Prema automatizaciji izdavanja SSL-a

Opisano je kako koristiti certbot kao klijenta ovdje.

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

Izvor: www.habr.com

Dodajte komentar