OpenSSL-essentials: werken met SSL-certificaten, privésleutels en CSR’s

Introductie

OpenSSL is een veelzijdige opdrachtregeltool die kan worden gebruikt voor een groot aantal taken met betrekking tot Public Key Infrastructure (PKI) en HTTPS (HTTP over TLS). Deze spiekbriefstijlgids biedt een snelle referentie voor OpenSSL-commando’s die nuttig zijn in veelvoorkomende, alledaagse scenario’s. Dit omvat OpenSSL-voorbeelden voor het genereren van privésleutels, certificaataanvragen en het converteren van certificaatformaten. Het behandelt niet alle gebruiken van OpenSSL.

Hoe dit gids te gebruiken:

  • Als u niet bekend bent met certificaataanvragen (CSRs), lees dan het eerste gedeelte
  • Behalve het eerste gedeelte is deze gids opgesteld als een spiekbriefje: een lijst met op zichzelf staande opdrachtregelvoorbeelden
  • Spring naar elk gedeelte dat relevant is voor de taak die u probeert uit te voeren (Hint: gebruik het Inhoudsopgave-menu of de Zoeken-functie van uw browser)
  • De meeste opdrachten zijn eenvoudige regels die zijn uitgebreid tot meerdere regels (met behulp van het \-symbool) voor duidelijkheid

Over Certificaataanvragen (CSRs)

Als u een SSL-certificaat van een commerciële certificaatautoriteit (CA) wilt verkrijgen, moet u een certificaataanvraag (CSR) genereren. Een CSR bestaat voornamelijk uit de openbare sleutel van een sleutelpaar en enkele aanvullende gegevens. Beide van deze componenten worden in het certificaat ingevoegd wanneer het wordt ondertekend.

Telkens wanneer u een CSR genereert, wordt u gevraagd informatie te verstrekken over het certificaat. Deze informatie staat bekend als een Distinguished Name (DN). Een belangrijk veld in de DN is de Common Name (CN), die het exacte Volledig Gekwalificeerde Domeinnaam (FQDN) van de host moet zijn die u van plan bent te gebruiken met het certificaat. Het is ook mogelijk om de interactieve prompts over te slaan bij het maken van een CSR door de informatie via de opdrachtregel door te geven of vanuit een bestand.

De andere items in een DN verstrekken aanvullende informatie over uw bedrijf of organisatie. Als u een SSL-certificaat van een certificaatautoriteit koopt, is het vaak vereist dat deze aanvullende velden, zoals “Organisatie”, nauwkeurig de details van uw organisatie weergeven.

Hier is een voorbeeld van hoe de prompt voor CSR-informatie eruit zal zien:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Als u niet-interactief antwoord wilt geven op de prompt voor CSR-informatie, kunt u dit doen door de -subj-optie toe te voegen aan alle OpenSSL-opdrachten die om CSR-informatie vragen. Hier is een voorbeeld van de optie, met dezelfde informatie als weergegeven in het codeblok hierboven:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Nu u CSRs begrijpt, kunt u naar het gedeelte van deze handleiding gaan dat uw OpenSSL-behoeften behandelt.

Genereren van CSRs

Deze sectie behandelt OpenSSL-opdrachten die verband houden met het genereren van CSRs (en privésleutels, indien ze nog niet bestaan). CSRs kunnen worden gebruikt om SSL-certificaten aan te vragen bij een certificaatautoriteit.

Houd er rekening mee dat u de CSR-informatie niet-interactief kunt toevoegen met de -subj-optie, zoals vermeld in de vorige sectie.

Genereer een privésleutel en een CSR

Gebruik deze methode als u HTTPS (HTTP over TLS) wilt gebruiken om uw Apache HTTP- of Nginx-webserver te beveiligen, en u een certificaatautoriteit (CA) wilt gebruiken om het SSL-certificaat uit te geven. De gegenereerde CSR kan naar een CA worden gestuurd om de uitgifte van een door de CA ondertekend SSL-certificaat aan te vragen. Als uw CA SHA-2 ondersteunt, voeg dan de optie -sha256 toe om de CSR te ondertekenen met SHA-2.

Deze opdracht maakt een 2048-bits privésleutel (domain.key) en een CSR (domain.csr) vanaf nul aan:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Beantwoord de prompt voor de CSR-informatie om het proces te voltooien.

De optie -newkey rsa:2048 geeft aan dat de sleutel 2048-bits moet zijn en wordt gegenereerd met het RSA-algoritme. De optie -nodes geeft aan dat de privésleutel niet moet worden versleuteld met een wachtwoordzin. De optie -new, die hier niet is opgenomen maar impliciet is, geeft aan dat een CSR wordt gegenereerd.

Genereer een CSR vanuit een bestaande privésleutel

Gebruik deze methode als u al een privésleutel heeft die u wilt gebruiken om een certificaat aan te vragen bij een CA.

Met dit commando wordt een nieuwe CSR (domain.csr) gemaakt op basis van een bestaande privésleutel (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Beantwoord de prompt voor de CSR-informatie om het proces te voltooien.

De optie -key geeft een bestaande privésleutel aan (domain.key) die zal worden gebruikt om een nieuwe CSR te genereren. De optie -new geeft aan dat een CSR wordt gegenereerd.

Genereer een CSR vanuit een bestaand certificaat en privésleutel

Gebruik deze methode als u een bestaand certificaat wilt vernieuwen, maar u of uw CA om de een of andere reden de originele CSR niet heeft. Het bespaart u in feite de moeite van het opnieuw invoeren van de CSR-informatie, aangezien die informatie wordt geëxtraheerd uit het bestaande certificaat.

Deze opdracht maakt een nieuwe CSR (domain.csr) op basis van een bestaand certificaat (domain.crt) en privésleutel (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

De optie -x509toreq geeft aan dat u een X509-certificaat gebruikt om een CSR te maken.

Genereren van SSL-certificaten

Als u een SSL-certificaat wilt gebruiken om een service te beveiligen maar u geen door een CA ondertekend certificaat nodig heeft, is een geldige (en gratis) oplossing om uw eigen certificaten te ondertekenen.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

Deze sectie behandelt OpenSSL-opdrachten die verband houden met het genereren van zelfondertekende certificaten.

Genereer een zelfondertekend certificaat

Gebruik deze methode als u HTTPS (HTTP over TLS) wilt gebruiken om uw Apache HTTP- of Nginx-webserver te beveiligen en u niet vereist dat uw certificaat door een CA wordt ondertekend.

Deze opdracht creëert een 2048-bit privésleutel (domain.key) en een zelfondertekend certificaat (domain.crt) vanaf nul:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Beantwoord de prompt voor CSR-informatie om het proces te voltooien.

De -x509 optie vertelt req om een zelfondertekend certificaat te maken. De -days 365 optie geeft aan dat het certificaat 365 dagen geldig zal zijn. Er wordt een tijdelijke CSR gegenereerd om informatie te verzamelen die aan het certificaat moet worden gekoppeld.

Genereer een zelfondertekend certificaat vanuit een bestaande privésleutel

Gebruik deze methode als je al een privésleutel hebt waarvoor je een zelfondertekend certificaat wilt genereren.

Deze opdracht creëert een zelfondertekend certificaat (domain.crt) vanuit een bestaande privésleutel (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Beantwoord de prompt voor CSR-informatie om het proces te voltooien.

De -x509 optie vertelt req om een zelfondertekend certificaat te maken. De -days 365 optie geeft aan dat het certificaat 365 dagen geldig zal zijn. De -new optie schakelt de prompt voor CSR-informatie in.

Genereer een zelfondertekend certificaat uit een bestaande privésleutel en CSR

Gebruik deze methode als je al een privésleutel en CSR hebt, en je wilt een zelfondertekend certificaat genereren met behulp van deze bestanden.

Deze opdracht genereert een zelfondertekend certificaat (domain.crt) uit een bestaande privésleutel (domain.key) en CSR (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

De optie -days 365 specificeert dat het certificaat geldig zal zijn voor 365 dagen.

Bekijk certificaten

Certificaat- en CSR-bestanden zijn gecodeerd in PEM-formaat, wat niet direct leesbaar is voor mensen.

Deze sectie behandelt OpenSSL-opdrachten die de werkelijke inhoud van PEM-gecodeerde bestanden zullen weergeven.

Bekijk CSR-invoer

Deze opdracht stelt je in staat om de inhoud van een CSR (domain.csr) in platte tekst te bekijken en te verifiëren:

  1. openssl req -text -noout -verify -in domain.csr

Weergave Certificaatvermeldingen

Met dit commando kunt u de inhoud van een certificaat (domain.crt) in platte tekst bekijken:

  1. openssl x509 -text -noout -in domain.crt

Controleer of een certificaat is ondertekend door een CA

Gebruik dit commando om te controleren of een certificaat (domain.crt) is ondertekend door een specifiek CA-certificaat (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Privésleutels

Deze sectie behandelt OpenSSL-commando’s die specifiek zijn voor het maken en verifiëren van privésleutels.

Maak een privésleutel aan

Gebruik dit commando om een wachtwoordbeveiligde, 2048-bits privésleutel aan te maken (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

Voer een wachtwoord in wanneer daarom wordt gevraagd om het proces te voltooien.

Controleer een privésleutel

Gebruik dit commando om te controleren of een privésleutel (domain.key) een geldige sleutel is:

  1. openssl rsa -check -in domain.key

Als uw privésleutel versleuteld is, wordt u gevraagd om het wachtwoord ervan in te voeren. Bij succes wordt de gedecodeerde sleutel op het terminalvenster weergegeven.

Controleer of een privésleutel overeenkomt met een certificaat en CSR

Gebruik deze commando’s om te controleren of een privésleutel (domain.key) overeenkomt met een certificaat (domain.crt) en CSR (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Als de uitvoer van elk commando identiek is, is er een uiterst grote kans dat de privésleutel, het certificaat en de CSR gerelateerd zijn.

Versleutel een privésleutel

Dit neemt een niet-versleutelde privésleutel (unencrypted.key) en geeft een versleutelde versie ervan terug (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Voer het gewenste wachtwoord in om de privésleutel mee te versleutelen.

Decrypteer een Privésleutel

Dit neemt een versleutelde privésleutel (encrypted.key) en geeft een gedecodeerde versie ervan weer (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Voer het wachtwoord voor de versleutelde sleutel in wanneer daarom wordt gevraagd.

Converteer Certificaatformaten

Alle certificaten waarmee we hebben gewerkt, zijn X.509-certificaten die ASCII PEM-gecodeerd zijn. Er zijn verschillende andere certificaatcoderings- en containerindelingen; sommige toepassingen geven de voorkeur aan bepaalde indelingen boven andere. Bovendien kunnen veel van deze indelingen meerdere items bevatten, zoals een privésleutel, certificaat en CA-certificaat, in een enkel bestand.

OpenSSL kan worden gebruikt om certificaten naar en van een groot aantal van deze indelingen te converteren. In dit gedeelte worden een aantal mogelijke conversies behandeld.

Converteer PEM naar DER

Gebruik deze opdracht als u een PEM-gecodeerd certificaat (domain.crt) wilt converteren naar een DER-gecodeerd certificaat (domain.der), een binair formaat:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

Het DER-formaat wordt typisch gebruikt met Java.

Converteer DER naar PEM

Gebruik dit commando als je een DER-gecodeerd certificaat (domain.der) wilt converteren naar een PEM-gecodeerd certificaat (domain.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

Converteer PEM naar PKCS7

Gebruik dit commando als je PEM-certificaten wilt toevoegen (domain.crt en ca-chain.crt) aan een PKCS7-bestand (domain.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Merk op dat je één of meer -certfile-opties kunt gebruiken om aan te geven welke certificaten aan het PKCS7-bestand moeten worden toegevoegd.

PKCS7-bestanden, ook bekend als P7B, worden typisch gebruikt in Java KeyStores en Microsoft IIS (Windows). Ze zijn ASCII-bestanden die certificaten en CA-certificaten kunnen bevatten.

Converteer PKCS7 naar PEM

Gebruik dit commando als je een PKCS7-bestand (domain.p7b) wilt converteren naar een PEM-bestand:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Let op dat als uw PKCS7-bestand meerdere items bevat (bijv. een certificaat en een tussenliggend CA-certificaat), het resulterende PEM-bestand alle items zal bevatten.

Converteer PEM naar PKCS12

Gebruik deze opdracht als u een privésleutel (domain.key) en een certificaat (domain.crt) wilt combineren tot een PKCS12-bestand (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

U wordt gevraagd om exportwachtwoorden, die u leeg kunt laten. Let op dat u een keten van certificaten aan het PKCS12-bestand kunt toevoegen door de certificaten samen te voegen in een enkel PEM-bestand (domain.crt) in dit geval.

PKCS12-bestanden, ook bekend als PFX-bestanden, worden doorgaans gebruikt voor het importeren en exporteren van certificaatketens in Microsoft IIS (Windows).

Converteer PKCS12 naar PEM

Gebruik deze opdracht als u een PKCS12-bestand (domain.pfx) wilt converteren naar PEM-indeling (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Let op dat als uw PKCS12-bestand meerdere items bevat (bijv. een certificaat en een privésleutel), het resulterende PEM-bestand alle items zal bevatten.

OpenSSL Versie

Met het openssl versie commando kun je controleren welke versie je gebruikt. De versie van OpenSSL die je gebruikt, en de opties waarmee het is gecompileerd, beïnvloeden de mogelijkheden (en soms de command line opties) die voor jou beschikbaar zijn.

Met het volgende commando wordt de OpenSSL-versie weergegeven die je gebruikt, en alle opties waarmee het is gecompileerd:

openssl version -a

Deze handleiding is geschreven met behulp van een OpenSSL-binair met de volgende details (de uitvoer van het vorige commando):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Conclusie

Dat zou moeten dekken hoe de meeste mensen OpenSSL gebruiken om met SSL-certificaten te werken. Het heeft vele andere toepassingen die hier niet zijn behandeld, dus voel je vrij om te vragen of andere toepassingen voor te stellen in de opmerkingen.

Als je problemen hebt met een van de commando’s, zorg er dan voor dat je reageert (en voeg je OpenSSL-versie uitvoer toe).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs