Sådan får du HTTPS til at arbejde på dit lokale udviklingsmiljø på 5 minutter

Næsten ethvert websted, du besøger i dag, er beskyttet af HTTPS. Hvis din ikke er endnu, burde det være. Sikring af din server med HTTPS betyder også, at du ikke kan sende anmodninger til denne server fra en, der ikke er beskyttet af HTTPS. Dette udgør et problem for udviklere, der bruger et lokalt udviklingsmiljø, fordi de alle kører //localhostuden for kassen.

Ved opstart, som jeg er en del af, besluttede vi at sikre vores AWS Elastic Load Balancer-slutpunkter med HTTPS som en del af et skridt for at forbedre sikkerheden. Jeg løb ind i en situation, hvor mit lokale udviklingsmiljøs anmodninger til serveren begyndte at blive afvist.

En hurtig Google-søgning senere fandt jeg flere artikler som denne, denne eller denne med detaljerede instruktioner om, hvordan jeg kunne implementere HTTPS på localhost. Ingen af ​​disse instruktioner syntes at virke, selv efter at jeg fulgte dem religiøst. Chrome kastede altid en NET::ERR_CERT_COMMON_NAME_INVALIDfejl på mig.

Problemet

Alle de detaljerede instruktioner, jeg havde fundet, var korrekte i det tidspunkt, de blev skrevet. Ikke mere.

Efter masser af googling opdagede jeg, at årsagen til, at mit lokale certifikat blev afvist, var, at Chrome havde afskaffet understøttelse af commonName-matching i certifikater, hvilket faktisk krævede et subjectAltName siden januar 2017.

Løsningen

Vi bruger OpenSSL til at generere alle vores certifikater.

Trin 1: Root SSL-certifikat

Det første trin er at oprette et Root Secure Sockets Layer (SSL) certifikat. Dette rodcertifikat kan derefter bruges til at underskrive et hvilket som helst antal certifikater, du måtte generere til individuelle domæner. Hvis du ikke er bekendt med SSL-økosystemet, gør denne artikel fra DNSimple et godt stykke arbejde med at introducere Root SSL-certifikater.

Generer en RSA-2048-nøgle, og gem den i en fil rootCA.key. Denne fil vil blive brugt som nøgle til at generere Root SSL-certifikatet. Du bliver bedt om en adgangskode, som du skal indtaste, hver gang du bruger denne nøgle til at generere et certifikat.

openssl genrsa -des3 -out rootCA.key 2048

Du kan bruge den nøgle, du genererede til at oprette et nyt Root SSL-certifikat. Gem det i en fil med navnet rootCA.pem. Dette certifikat har en gyldighed på 1.024 dage. Du er velkommen til at ændre det til et hvilket som helst antal dage, du ønsker. Du bliver også bedt om andre valgfri oplysninger.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

Trin 2: Stol på rod SSL-certifikatet

Før du kan bruge det nyoprettede Root SSL-certifikat til at begynde at udstede domænecertifikater, er der endnu et trin. Du skal fortælle din Mac at stole på dit rodcertifikat, så alle individuelle certifikater, der er udstedt af den, er også tillid til.

Åbn nøgleringadgang på din Mac, og gå til kategorien Certifikater i din systemnøglering. Når du er der, skal du importere ved rootCA.pemhjælp af File> Import Items. Dobbeltklik på det importerede certifikat, og skift rullemenuen "Når du bruger dette certifikat:" til Altid trust i afsnittet Tillid.

Dit certifikat skal se sådan ud i Keychain Access, hvis du korrekt har fulgt instruktionerne indtil nu.

Trin 2: SSL-certifikat for domæne

Rod-SSL-certifikatet kan nu bruges til at udstede et certifikat specifikt til dit lokale udviklingsmiljø, der ligger i localhost.

Opret en ny OpenSSL-konfigurationsfil, server.csr.cnfså du kan importere disse indstillinger, når du opretter et certifikat i stedet for at indtaste dem på kommandolinjen.

[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [dn] C=US ST=RandomState L=RandomCity O=RandomOrganization OU=RandomOrganizationUnit [email protected] CN = localhost

Opret en v3.extfil for at oprette et X509 v3-certifikat. Bemærk hvordan vi specificerer subjectAltNameher.

authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost

Opret en certifikatnøgle til localhostbrug af de konfigurationsindstillinger, der er gemt i server.csr.cnf. Denne nøgle er gemt i server.key.

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )

En anmodning om certifikatsignering udstedes via root-SSL-certifikatet, som vi oprettede tidligere for at oprette et domænecertifikat til localhost. Outputtet er en certifikatfil kaldet server.crt.

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Brug dit nye SSL-certifikat

Du er nu klar til at sikre din localhostmed HTTPS. Flyt server.keyog server.crtfiler til et tilgængeligt sted på din server, og inkluderer dem, når du starter din server.

I en Express-app skrevet i Node.js, her er hvordan du ville gøre det. Sørg for, at du kun gør dette for dit lokale miljø. Brug ikke dette til produktion .

Jeg håber, du fandt denne tutorial nyttig. Hvis du ikke er fortrolig med at køre de kommandoer, du selv har givet her, har jeg oprettet et sæt praktiske scripts, som du hurtigt kan køre for at generere certifikaterne til dig. Flere detaljer kan findes på GitHub repo.

Jeg elsker at hjælpe andre webudviklere. Følg mig på Twitter og fortæl mig, hvis du har nogle forslag eller feedback. Hvis du gerne vil vise din påskønnelse over for noget af det arbejde, jeg har udført, det være sig et blogindlæg, et open source-projekt eller bare en sjov tweet, kan du købe en kop kaffe til mig.