GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zertifizierungsstelle mit OpenSSL

Dieser Artikel zeigt Ihnen, wie Sie eine Zertifizierungsstelle mit OpenSSL einrichten. Digitale Zertifikate sind Dokumente, die verwendet werden, um den Besitz eines öffentlichen Schlüssels nachzuweisen. Beispielsweise wird ein digitales Zertifikat verwendet, um eine aufgerufene Website über HTTPS zu authentifizieren. Ein weiteres Beispiel für eine häufige Verwendung ist das Signieren von Dokumenten.

Zertifikate enthalten Informationen über den Schlüssel, die Identität seines Besitzers und die digitale Signatur einer Entität, die den Inhalt verifiziert hat. Eine Zertifizierungsstelle (CA) ist die Organisation, die digitale Zertifikate ausstellt.

Außerdem zeigt dieser Artikel, wie man anderen Hosts mitteilt, den ausgestellten Zertifikaten zu vertrauen.

Warnung :Dies sollte nur zu Testzwecken oder zum Nachweis des Konzepts dienen. Für reale Anwendungen sollten Sie echte Zertifikate von einer echten Zertifizierungsstelle erwerben. Wenn Sie beispielsweise nur HTTPS und das Zertifikat kostenlos möchten, gehen Sie einfach zu https://letsencrypt.org/

Installieren Sie OpenSSL

Mein Hauptbetriebssystem ist FreeBSD, und ich verwende gerne den Ports-Baum, um es zu installieren, führen Sie einfach Folgendes aus:

# cd /usr/ports/security/openssl
# make install clean

Und warten Sie, bis die Kompilierung und Installation des Ports abgeschlossen ist. Beachten Sie, dass Sie wahrscheinlich bereits eine ausführbare Openssl-Datei haben (unter /usr/bin-Pfad) und wenn Sie sie trotzdem installieren, befindet sich die „Port“-Binärdatei unter /usr/local /bin/openssl.

Als ich mich zum ersten Mal mit OpenSSL befasste, funktionierte die bereitgestellte Binärdatei nicht für mich, aber der Port schon.

Konfigurationsdatei

Obwohl mein Hauptbetriebssystem FreeBSD ist, sollten von nun an die gleichen Schritte auf jedem Betriebssystem ausgeführt werden, das OpenSSL unterstützt. Vielleicht müssen Sie einige Pfade anpassen, aber das ist alles.

Sie finden (wieder in FreeBSD) eine Beispiel- und gut kommentierte Konfigurationsdatei in /usr/local/openssl/openssl.conf. Dies ist nach einigen Aufräumarbeiten meins, ich habe die wichtigsten Einstellungen hervorgehoben:

#OpenSSL Home current directory
HOME                    = /var/openssl #choose any reasonable location
#RANDFILE                = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
oid_section             = new_oids

[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

[ ca ]
default_ca      = YourCA              # The default Certificate Authority section

[ YourCA ] #most important section of your file
dir             = /var/openssl/yourCA           # Where everything is kept
                                                              # choose any reasonable location
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/CA/yourCA.crt  # The CA certificate
serial          = $dir/serial           # The current serial number
#crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/CA/yourCA.crl  # The current CRL
private_key     = $dir/CA/yourCA.key  # The private key
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = supplied
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
localityName            = supplied

# For the 'anything' policy. At this point in time, you must list all 
# acceptable 'object' types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

############################################################
[ req ]
default_bits            = 2048
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AR #I'm on ARgentina
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Salta # i.e. the province I live on

localityName                    = Locality Name (eg, city)

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Your company name

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Section Name. # eg. IT
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true

[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

[ tsa ]
default_tsa = tsa_config1       # the default TSA section

[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir             = ./demoCA              # TSA root directory
serial          = $dir/tsaserial        # The current serial number (mandatory)
crypto_device   = builtin               # OpenSSL engine to use for signing
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
                                        # (optional)
certs           = $dir/cacert.pem       # Certificate chain to include in reply
                                        # (optional)
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy  = tsa_policy1           # Policy if request did not specify it
                                        # (optional)
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
digests         = md5, sha1             # Acceptable message digests (mandatory)
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
clock_precision_digits  = 0     # number of digits after dot. (optional)
ordering                = yes   # Is ordering defined for timestamps?
                                # (optional, default: no)
tsa_name                = yes   # Must the TSA name be included in the reply?
                                # (optional, default: no)
ess_cert_id_chain       = no    # Must the ESS cert id chain be included?
                                # (optional, default: no)

Glossar

Bevor wir fortfahren, ein kleines Glossar der in der Datei verwendeten Akronyme:

  • CA:steht für Certificate Authority
  • CRL:steht für Certificate Revocation Lists
  • CSR:steht für Certificate Signing Request
  • MD:steht für Message Digest
  • TSA:steht für Time Stamping Authority

Zertifikatsspeicher

Erstellen Sie als Nächstes die Verzeichnisse und (vorerst leeren) Dateien zum Speichern unserer Schlüssel und Zertifikate:

# cd /var/openssl
# mkdir -p yourCA/CA
# mkdir -p yourCA/newcerts
# mkdir -p yourCA/certs/keys
# mkdir -p yourCA/certs/requests
# mkdir -p yourCA/certs/certificates
# cd yourCA
# touch index.txt
# echo 01 > serial

CA-Zertifikat

Jetzt können Sie Ihr Zertifizierungsstellenzertifikat erstellen und signieren. Aber zuerst müssen wir mit dem folgenden Befehl einen privaten Schlüssel erstellen:

# /usr/local/bin/openssl genrsa -out yourCA/CA/yourCA.key 2048

Erstellen Sie zweitens eine CSR, indem Sie Folgendes ausführen:

# /usr/local/bin/openssl req -new -key ./yourCA/CA/yourCA.key -out yourCA/CA/yourCA.csr

Befolgen Sie die Anweisungen auf dem Bildschirm und achten Sie darauf, die richtigen Informationen einzugeben. Abschließend signieren Sie Ihr Zertifikat selbst:

# /usr/local/bin/openssl x509 -req -days 365 \
> -in yourCA/CA/yourCA.csr -out yourCA/CA/yourCA.crt \
> -signkey yourCA/CA/yourCA.key

Und das war's:Jetzt können Sie mit dem Signieren Ihrer Client- und/oder Webzertifikate beginnen

Client-Zertifikate

Der Prozess ist dem vorherigen ziemlich ähnlich. Aber wir verwenden unser CA-Zertifikat, um das Client-Zertifikat zu signieren. Und im Idealfall generiert der Client seinen eigenen privaten Schlüssel und den CSR.

Wie auch immer, wir testen nur Sachen, also mache ich jeden Schritt und verteile dann die generierten Zertifikate an meine Benutzer. Die folgenden Befehle können überall ausgeführt werden, aber nur um etwas Ordnung zu halten, verwende ich die zuvor erstellten Ordner (unter /var/openssl/yourCA/certs ). Unser Benutzer, John Doe, benötigt zuerst einen privaten Schlüssel:

# cd /var/openssl/yourCA/certs
# /usr/local/bin/openssl genrsa -des3 -out keys/johndoe.key 2048

Vergessen Sie nicht die Passphrase, da sie mehrmals gefragt wird; Erstellen Sie als Nächstes die Zertifikatsignierungsanforderung:

# /usr/local/bin/openssl req -new -key keys/johndoe.key -out requests/johndoe.csr

Als nächstes signieren Sie das Zertifikat mit diesem Befehl:

# /usr/local/bin/openssl ca -in requests/johndoe.csr -cert ../CA/yourCA.crt -keyfile ../CA/yourCA.key -out certificates/johndoe.crt

Exportieren Sie schließlich das Zertifikat in das PKCS12-Format, Sie werden nach der Passphrase des PK:

gefragt
# /usr/local/bin/openssl pkcs12 -export -clcerts -in certificates/johndoe.crt -inkey keys/johndoe.key -out certificates/johndoe.p12

Installieren des Zertifikats

Jetzt können Sie Ihre eigenen Zertifikate ausgeben, die Ihr Benutzer installieren muss, um sie zu verwenden. Sie müssen zwei Dateien liefern:yourCA.crt und die persönliche johndoe.p12.

Um es unter Windows zu installieren, verwenden Sie das Certificate Manager Tool. Ich lade nicht mehrere Screenshots hoch, weil ich es nicht sehr nützlich finden würde, da mein Fenster auf Spanisch ist. Klicken Sie auf das Startmenü und führen Sie „certmgr.msc“ aus. Der folgende Bildschirm wird angezeigt:

Klicken Sie mit der rechten Maustaste auf den Ordner „Stammzertifizierungsstelle“ und wählen Sie „Importieren“. Beginnen Sie mit yourCA.crt und wählen Sie die Stammzertifizierungsstelle des Stores aus, folgen Sie dem Assistenten.

Klicken Sie nun mit der rechten Maustaste auf den Ordner Personal und wiederholen Sie den Assistenten mit der Datei johndoe.p12. Sie werden nach der Passphrase gefragt. Wenn der Assistent abgeschlossen ist, können Sie Ihr installiertes gültiges Zertifikat und die Details sehen:

Denken Sie daran, dass dies nur zu Lernzwecken dient. Aber auch das ist Vertrauenssache. Wenn Ihre Organisation klein genug ist und Vertrauen vorhanden ist, sollten Sie mit diesen DIY-Zertifikaten arbeiten können.


Linux
  1. Testen von SSL-Verbindungen mit SSLyze, Nmap oder OpenSSL

  2. Hpkp-Fingerabdrücke für alle Zertifikatsketten generieren?

  3. Verwenden von openssl, um das Zertifikat von einem Server abzurufen

  4. Openssl:Fehler selbstsigniertes Zertifikat in Zertifikatskette

  5. Wie richte ich meine eigene voll funktionsfähige Zertifizierungsstelle ein?

Erstellen Sie Ihre eigene Zertifizierungsstelle (CA) in CentOS/RHEL

So generieren Sie selbstsignierte SSL-Zertifikate mit OpenSSL

Ersetzen Sie in Plesk ein SHA-1-Zertifikat durch ein SHA-2-Zertifikat

Sichern Sie Nginx mit Let’s Encrypt SSL-Zertifikat auf Ubuntu 18.04

So sichern Sie Nginx mit dem Let’s Encrypt SSL-Zertifikat

Wie erstelle ich ein Openssl-Zertifikat mit einem Ablauf von weniger als einem Tag?