Vermisse ich etwas Ist dies der richtige Weg, um ein selbstsigniertes Zertifikat zu erstellen?
Es ist einfach, ein selbstsigniertes Zertifikat zu erstellen. Sie verwenden nur dieopenssl req
Befehl. Es kann schwierig sein, einen zu erstellen, der von der größten Auswahl an Clients wie Browsern und Befehlszeilentools verwendet werden kann.
Dies ist schwierig, da die Browser ihre eigenen Anforderungen haben und restriktiver sind als die IETF . Die von Browsern verwendeten Anforderungen sind in den CA / Browser-Foren dokumentiert (siehe Referenzen unten). Die Einschränkungen treten in zwei Schlüsselbereichen auf: (1) Vertrauensanker und (2) DNS-Namen.
Moderne Browser (wie die Warez, die wir 2014/2015 verwenden) möchten ein Zertifikat, das mit einem Vertrauensanker verknüpft ist, und sie möchten, dass DNS-Namen im Zertifikat auf bestimmte Weise dargestellt werden. Und Browser bewegen sich aktiv gegen selbstsignierte Serverzertifikate.
Einige Browser machen es nicht gerade einfach, ein selbstsigniertes Serverzertifikat zu importieren. In der Tat können Sie nicht mit einigen Browsern, wie Android Browser. Die vollständige Lösung besteht also darin, Ihre eigene Autorität zu werden.
Wenn Sie nicht zu Ihrer eigenen Autorität werden, müssen Sie die richtigen DNS-Namen eingeben, um dem Zertifikat die größten Erfolgschancen zu geben. Aber ich würde Sie ermutigen, Ihre eigene Autorität zu werden. Es ist einfach, Ihre eigene Autorität zu werden, und es wird alle Vertrauensprobleme umgehen (wem kann man besser vertrauen als Ihnen selbst?).
Dies ist wahrscheinlich nicht die Seite, die Sie suchen!
Die Sicherheitszertifikat der Website ist nicht vertrauenswürdig!
Dies liegt daran, dass Browser eine vordefinierte Liste von Vertrauensankern verwenden, um Serverzertifikate zu validieren. Ein selbstsigniertes Zertifikat ist nicht an einen vertrauenswürdigen Anker gebunden.
Der beste Weg, dies zu vermeiden, ist:
- Erstellen Sie Ihre eigene Autorität (dh werden Sie eine Zertifizierungsstelle )
- Erstellen Sie eine Zertifikatsignierungsanforderung (Certificate Signing Request, CSR) für den Server
- Signieren Sie die CSR des Servers mit Ihrem CA-Schlüssel
- Installieren Sie das Serverzertifikat auf dem Server
- Installieren Sie das CA-Zertifikat auf dem Client
Schritt 1 - Erstellen Sie Ihre eigene Berechtigung. Sie müssen lediglich ein selbstsigniertes Zertifikat mit CA: true
ordnungsgemäßer Schlüsselverwendung erstellen . Dies bedeutet, dass der Betreff und der Aussteller dieselbe Entität sind, die Zertifizierungsstelle in den grundlegenden Einschränkungen auf "true" gesetzt ist (sie sollte auch als kritisch markiert werden), die Schlüsselverwendung lautet keyCertSign
und crlSign
(wenn Sie CRLs verwenden) und die Betreffschlüsselkennung (SKI) das gleiche wie die Authority Key Identifier (AKI).
Informationen zum Werden Ihrer eigenen Zertifizierungsstelle finden Sie unter * Wie unterschreiben Sie eine Zertifikatsignierungsanforderung bei Ihrer Zertifizierungsstelle? bei Stapelüberlauf. Importieren Sie anschließend Ihre Zertifizierungsstelle in den vom Browser verwendeten Trust Store.
Die Schritte 2 bis 4 sind ungefähr das, was Sie jetzt für einen öffentlich zugänglichen Server tun, wenn Sie die Dienste einer Zertifizierungsstelle wie Startcom oder CAcert in Anspruch nehmen . In den Schritten 1 und 5 können Sie die Autorität Dritter umgehen und als Ihre eigene Autorität fungieren (wem können Sie besser vertrauen als Ihnen selbst?).
Der nächstbeste Weg, um die Browserwarnung zu vermeiden, besteht darin, dem Zertifikat des Servers zu vertrauen. Einige Browser, wie der Standardbrowser von Android, lassen dies jedoch nicht zu. Es wird also niemals auf der Plattform funktionieren.
Das Problem, dass Browser (und andere ähnliche Benutzeragenten) selbstsignierten Zertifikaten nicht vertrauen, wird im Internet der Dinge (Internet of Things, IoT) ein großes Problem darstellen. Was passiert zum Beispiel, wenn Sie eine Verbindung zu Ihrem Thermostat oder Kühlschrank herstellen, um ihn zu programmieren? Die Antwort lautet: Nichts Gutes für die Benutzererfahrung.
Die WebAppSec-Arbeitsgruppe des W3C beginnt sich mit dem Problem zu befassen. Siehe zum Beispiel Vorschlag: HTTP als nicht sicher markieren .
So erstellen Sie ein selbstsigniertes Zertifikat mit OpenSSL
Die folgenden Befehle und die Konfigurationsdatei erstellen ein selbstsigniertes Zertifikat (es zeigt Ihnen auch, wie Sie eine Signaturanforderung erstellen). Sie unterscheiden sich in einer Hinsicht von anderen Antworten: Die für das selbstsignierte Zertifikat verwendeten DNS-Namen befinden sich im SAN (Subject Alternate Name) und nicht im Common Name (CN) .
Die DNS-Namen werden im SAN über die Konfigurationsdatei mit der Zeile abgelegt subjectAltName = @alternate_names
(es gibt keine Möglichkeit, dies über die Befehlszeile zu tun). Dann gibt es einen alternate_names
Abschnitt in der Konfigurationsdatei (Sie sollten diesen nach Ihrem Geschmack einstellen):
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# IP.1 = 127.0.0.1
# IP.2 = ::1
Es ist wichtig, den DNS-Namen in das SAN und nicht in den CN einzufügen, da sowohl die IETF- als auch die CA / Browser-Foren die Vorgehensweise festlegen. Sie geben auch an, dass DNS-Namen im CN veraltet (aber nicht verboten) sind. Wenn Sie einen DNS-Namen in den CN eingeben, muss dieser unter den CA / B-Richtlinien im SAN enthalten sein. Sie können es also nicht vermeiden, den alternativen Betreffnamen zu verwenden.
Wenn Sie keine DNS-Namen in das SAN einfügen, kann das Zertifikat unter einem Browser und anderen Benutzeragenten, die den Richtlinien des CA / Browser-Forums entsprechen, nicht überprüft werden.
Verwandte Themen: Browser befolgen die Richtlinien des CA / Browser-Forums. und nicht die IETF-Richtlinien. Dies ist einer der Gründe, warum ein mit OpenSSL erstelltes Zertifikat (das im Allgemeinen der IETF folgt) manchmal nicht unter einem Browser validiert wird (Browser folgen der CA / B). Sie sind unterschiedliche Standards, haben unterschiedliche Ausstellungsrichtlinien und unterschiedliche Validierungsanforderungen.
Erstellen Sie ein selbstsigniertes Zertifikat (beachten Sie die Hinzufügung der -x509
Option):
openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.cert.pem
Erstellen Sie eine Signaturanforderung (beachten Sie das Fehlen einer -x509
Option):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
Drucken Sie ein selbstsigniertes Zertifikat aus :
openssl x509 -in example-com.cert.pem -text -noout
Eine Signaturanfrage drucken :
openssl req -in example-com.req.pem -text -noout
Konfigurationsdatei (über -config
Option übergeben)
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
Möglicherweise müssen Sie für Chrome Folgendes tun. Andernfalls kann sich Chrome beschweren, dass ein allgemeiner Name ungültig ist ( ERR_CERT_COMMON_NAME_INVALID
) . Ich bin mir nicht sicher, wie die Beziehung zwischen einer IP-Adresse im SAN und einem CN in diesem Fall ist.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
Es gibt andere Regeln für den Umgang mit DNS-Namen in X.509 / PKIX-Zertifikaten. In diesen Dokumenten finden Sie die Regeln:
RFC 6797 und RFC 7469 werden aufgelistet, da sie restriktiver sind als die anderen RFCs und CA / B-Dokumente. Die RFCs 6797 und 7469 erlauben ebenfalls keine IP-Adresse.