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.