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

Apache – Erstellen eines *.local SSL-Zertifikats?

Ich versuche, ein einzelnes SSL-Zertifikat einzurichten, mit dem jede *.local-Website über https funktioniert. Ich habe alle .local-Domains, die auf meinen lokalen Computer verweisen. Ich verwende diese bei der Entwicklung von Websites. Viele neue Funktionen (Geolokalisierung, Servicemitarbeiter usw.) erfordern ein SSL.

Ich glaube, dass bei neueren Versionen von Chrome/Firefox ein selbstsigniertes Zertifikat der alten Schule nicht mehr funktioniert.

Nachfolgend sind die Schritte aufgeführt, die ich unternommen habe, nachdem ich eine Kombination dieser Anleitungen befolgt habe:
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/

https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo

Hier ist meine Konfigurationsdatei:

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

Ich erstelle zuerst eine neue Zertifizierungsstelle:

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

Ich habe den Common name hier als meinen Namen angegeben

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

Die Datei certs/cacert.pem Ich importiere dann in die Behörden von Chromium, was ohne Probleme funktioniert.

Dann erstelle ich eine Zertifikatsanforderung:

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

Ich habe den Common Name hier als *.local

angegeben
Common Name (hostname, IP, or your name) []:*.local

Ich unterschreibe dann die Anfrage:

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

Ich füge die Dateien meiner http-Konfiguration hinzu:

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

Ich habe Apache neu gestartet, erhalte aber immer noch NET::ERR_CERT_COMMON_NAME_INVALID

Ich hatte den Eindruck, dass dies daran lag, dass ich den subjectAltName zur Konfigurationsdatei hinzufügen musste, was ich getan habe.

Bitte teilen Sie mir mit, was ich anders machen soll.

Vielen Dank im Voraus für jede Hilfe

Bearbeiten

Ich denke, das Problem ist mit dem Platzhalter zu tun. Wenn ich die alternate_names auf example.local und den allgemeinen Namen für die Anfrage auf example.local setze, wird example.local sowohl in Chrome als auch in Firefox als sicher angezeigt.

Ich habe versucht, DNS.1 auf local zu setzen und DNS.2 zu *.local , bekam ich dann nur ERR_SSL_SERVER_CERT_BAD_FORMAT in Chrom und SEC_ERROR_REUSED_ISSUER_AND_SERIAL im Firefox. Ich habe auf jeden Fall meine Seriendatei und meine Indexdatei zurückgesetzt, bevor ich die Zertifikate generiert habe.

Akzeptierte Antwort:

Sie haben SAN zur CSR hinzugefügt aber Sie haben es ca nicht gesagt um Erweiterungen aus dem CSR aufzunehmen im Zertifikat. Siehe https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate oder die Manpage für ca auch im Web unter copy_extensions

EDIT:Du auch müssen x509_extensions angeben im ca config oder gleichwertig, aber weniger bequem die Befehlszeilenoption -extensions , die in beiden Fällen auf einen Abschnitt verweisen, der vorhanden ist, aber leer sein kann, wenn Sie keine CA-erforderlichen Erweiterungen wünschen. Das ist mir zunächst nicht aufgefallen, da ich nur den Fall der Erweiterungen von CSR noch nie ausprobiert hatte und nicht config, was für die meisten Zertifizierungsstellen unrealistisch ist. Wenn Sie copy_extensions angeben außer none (und die CSR hat einige), aber geben Sie x509_extensions nicht an dann ca macht Fügen Sie die Erweiterungen in das Zertifikat ein, aber nicht Setzen Sie die Zertifikatsversion auf v3, wie es von Standards (wie rfc5280) gefordert wird, wenn Erweiterungen vorhanden sind.

Verwandt:GNU-Bildschirm:Eine getrennte Sitzung auf stdout drucken?

Es ist fraglich, ob dies ein Fehler ist; die Manpage sagt x509_extensions/extensions steuert die v3-Einstellung und nicht Ähnliches über copy_extensions sagen impliziert, dass dies nicht der Fall ist, aber IMHO ist es sicherlich ein sehr suboptimales Feature. BEARBEITEN:Es ist ein Fehler und wird behoben, aber bis dahin verwenden Sie die Problemumgehung, siehe https://unix.stackexchange.com/a/394465/59699

ABER:In meinem Test hat dies Ihr Problem nicht wirklich gelöst. Obwohl das Zertifikat *.local hat in SAN und CN und ist (jetzt) ​​ansonsten gültig, mein Firefox (53.0.2) und Chrome (59.0.3071.109) lehnen es immer noch mit SSL_ERROR_CERT_DOMAIN_ERROR bzw. ERR_CERT_COMMON_NAME_INVALID ab. Ich vermutete, dass sie local nicht ausschließen aus der normalen 2+-Level-Logik und versuchte es mit *.example.local :Chrome akzeptiert das, Firefox jedoch nicht. Ich habe es auch mit *.example.org versucht und sowohl Chrome als auch IE11 mögen das aber immer noch nicht Firefox (und sich selbst natürlich Namen in echten TLDs wie .org zuweisen ist nicht die Art und Weise, wie DNS funktionieren soll).

Das hat mich stecken. Mit etwas Arbeit kann OpenSSL dazu gebracht werden, ein Zertifikat zu generieren, das fast alles enthält, was Sie wollen, aber was Firefox und Chrome akzeptieren Ich weiß nicht. Ich werde versuchen, das zu untersuchen und zu aktualisieren, wenn ich etwas finde.

Ich hoffe du meinst Sie haben *.local angegeben als CommonName nur für die Server-CSR und NICHT für das CA-Zertifikat (selbstsigniert). Wenn die Betreffnamen für CA- und Blattzertifikate identisch sind, funktioniert nichts zuverlässig. BEARBEITEN:Ihr bearbeitetes Q bestätigt, dass sie korrekt unterschiedlich waren. Es wird jedoch nicht erwähnt, dass auch Land, Staat und Organisation angegeben werden, wie es von ca gefordert wird Richtlinie, die Sie verwendet haben.

Beachten Sie, dass „selbst signiert“ ein Kunstbegriff ist und mit demselben Schlüssel signiert bedeutet . Ihr CA-Zertifikat ist selbstsigniert. Ihr Serverzertifikat wird von Ihnen selbst mit Ihrem eigenen Schlüssel signiert, ist es aber nicht selbst signiert. Der Versuch, Anweisungen für ein selbstsigniertes Zertifikat auf ein nicht selbstsigniertes Zertifikat anzuwenden, war Teil Ihres Problems.

Und Gilles Punkt über md5 für den Signaturalgorithmus ist auch richtig.

BEARBEITEN:Seriennummer (und Index) für einen openssl ca zurücksetzen Setup ist eine schlechte Idee, es sei denn, Sie verwerfen das CA-Zertifikat und den Namen dauerhaft sie wurden verwendet für. Die Standards besagen, dass eine bestimmte Zertifizierungsstelle nicht mehr als ein Zertifikat mit demselben Seriennummernwert im Zertifikat ausstellen darf, und die serielle Datei ist übrigens openssl ca (und auch x509 -req ) setzt dies um. „Echte“ (öffentliche) Zertifizierungsstellen verwenden heutzutage keinen einfachen Zähler mehr, sondern enthalten Entropie, um Kollisionsangriffe auf PKI – Google Hashclash – zu blockieren, aber das ist kein Problem für eine persönliche Zertifizierungsstelle wie Ihre. Ich kann leicht glauben, dass ein Browser (oder ein anderer Relirier) unzufrieden ist, wenn er mehrere Zertifikate mit derselben Seriennummer und demselben CA-Namen sieht, obwohl ich NICHT erwarten würde, dass ein Browser dauerhaft ein Blattzertifikat speichert – und somit sowohl die alten als auch die neuen darin sieht ein Prozess, es sei denn, er läuft lange – es sei denn, Sie importieren ihn in den entsprechenden Store, einschließlich in Firefox, wenn Sie ihn zu einer dauerhaften „Ausnahme“ machen.

Verwandte:Großbuchstabe S in Berechtigungen eines Ordners?
Linux
  1. Curl:(60) SSL-Zertifikatsproblem:Lokales Ausstellerzertifikat kann nicht abgerufen werden?

  2. So generieren Sie eine Certificate Signing Request (CSR) für ein SSL

  3. Was ist ein SSL-Zertifikat?

  4. Erstellen von Apache-Umleitungen

  5. „Arten von SSL-Zertifikaten“

Was ist ein SSL-Zertifikat?

So installieren Sie das SSL-Zertifikat unter CentOS 7

Erstellen eines selbstsignierten SSL-Zertifikats

SSL-Checker-Tool

So erstellen Sie ein lokales selbstsigniertes SSL-Zertifikat unter CentOS 8

So überprüfen Sie das SSL-Ablaufdatum auf Plesk