openssl “kann 'distinguished_name' in config nicht finden”

39

Ich erhalte den folgenden Fehler von openssl req:

unable to find 'distinguished_name' in config
problems making Certificate Request
41035:error:0E06D06C:configuration file routines:NCONF_get_string:no value:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/crypto/conf/conf_lib.c:329:group=req name=distinguished_name

Mein Verständnis ist , dass dies die „Subject“ ist , dass es nicht ... aber nicht finden, ich bin angeben , dass:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=ACME, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"

Der einzige Vorschlag des Handbuchs ist, dass die Konfigurationsdatei nicht existiert. Ich kann cat "$OPTIONS_FILE", also ist es definitiv da, und dem Fehler geht nicht der Fehler voraus, sondern die manuelle Notiz, der er vorausgehen würde, wenn dies der Fall wäre. Ich bin mir also ziemlich sicher, openssldass die Konfigurationsdatei angezeigt wird.

Meine Konfigurationsdatei enthält Folgendes:

[req]
req_extensions = v3_req

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

[alt_names]
DNS.1 = *.*.example.com 

... was im wahrsten Sinne des Wortes das Beispiel in den Dokumenten ist .

Was mache ich hier falsch?

Thanatos
quelle
1
Kleiner Hinweis: Der hier angegebene subjectAltName *.*.example.comist ungültig. (Sie können nur 1 *und nur in der Komponente ganz links haben.) Dies bezieht sich nicht auf das Problem hier, aber nicht blind c / p.
Thanatos

Antworten:

28

Fast wie ich sehen kann , -configüberschreibt es eine Art interne Konfiguration; Wenn Sie den Abschnitt "BEISPIELE" für die Manpage für openssl req sehen , zeigt er ein Beispiel einer Konfigurationsdatei mit distinguished_namedarin. Aus gutem Grund habe ich meiner Konfiguration Folgendes hinzugefügt:

[req]
…
distinguished_name = req_distinguished_name

[req_distinguished_name]
# empty.

Somit sah meine gesamte Konfiguration ungefähr so ​​aus

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

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

[alt_names]
DNS.1 = *.*.${DOMAIN}

(Beachten Sie, dass dies ${DOMAIN}kein wörtliches Wort ist. Sie sollten es durch Ihren DNS-Domänennamen ersetzen. Ich erstelle diese Datei in einem bashSkript mit cat >"$OPTIONS_FILE" <<EOF, gefolgt von dem oben Gesagten, gefolgt von. EOF)

openssl req … -subj <my subject> -config <that file> …dann nahm mein Thema von der Kommandozeile. Für die Interessenten sah der gesamte Befehl folgendermaßen aus:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=My Company, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"

Meines Wissens nach ist SHA-1 für X.509-Zertifikate veraltet¹, daher -sha256(was ein undokumentiertes Flag ist…), und subjectAltName wird erforderlich², weshalb die Konfiguration erforderlich ist. Die einzige zusätzliche Information, die mir bekannt ist, um eine Best-Practice-CSR für das oben Genannte zu generieren, ist, dass Sie eine RSA-Schlüsselgröße von mindestens 2048 Bit verwenden sollten (wenn Sie RSA verwenden, was ich bin). Sie müssen die Größe des openssl genrsaBefehls angeben, da der aktuelle Standardwert unsicher ist.

¹Während ich nicht kaputt bin, fühlen die Leute, dass es nur eine Frage der Zeit ist. Siehe "Allmähliche Sonneneinstrahlung von SHA1".
²Die Verwendung von CN für den Domainnamen wird nicht mehr empfohlen. Ich bin mir nicht sicher, wann / ob Browser dies ablehnen. "Entfernen Sie sich vom Einschließen und Überprüfen von Zeichenfolgen, die wie Domänennamen im allgemeinen Namen des Betreffs aussehen.", RFC 6125
Hinweis: Der "richtige" Wert von ist mir weniger sicher keyUsage.

Thanatos
quelle
2
Siehe meine Anmerkung zu der Frage; Die Konfiguration in dieser Antwort ist ungültig, da sie *.*.example.comnicht gültig ist (Sie können nicht mehrere *s haben). c / p -ers aufgepasst.
Thanatos
Der leere Bereich req_distinguished_namewird von openssl 1.1.0f nicht akzeptiert, Sie müssen also mindestens countryName_defaultdort sein (siehe Openssl.conf Walkthru ).
AntonK
10

Ich hatte das gleiche Problem und fand die Antwort hier:

https://www.citrix.com/blogs/2015/04/10/how-to-create-a-csr-for-a-san-certificate-on-netscaler/

Die Konfigurationsdatei sieht folgendermaßen aus:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = www.company.net 
DNS.4 = company.net 

Und dann:

openssl req -new -key private.key -sha256 -nodes -config openssl.conf -out certificate.csr
Miquel
quelle
1
Das würde auch funktionieren; Ich habe den Betreff in der Befehlszeile angegeben (da dies für meinen Anwendungsfall einfacher war). Das verschiebt es einfach in die Konfigurationsdatei. Außerdem bezog sich meine Frage auf die Beschwerde von OpenSSL, dass das Thema nicht gefunden werden konnte, obwohl es genau angegeben worden war.
Thanatos
Ich bin nicht sicher, ob diese Lösung funktioniert - in Windows wird ständig gemeldet, dass "Distinguished_Name nicht in der Konfiguration gefunden werden kann".
Hagubear
Der req_distinguished_nameAbschnitt kann leer gelassen werden. Was es tut, ist, die Vorlage der Beschriftungen der erforderlichen Feldnamen anzugeben, die durch -subj= /C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xxusw. überschrieben werden können . Es ist jedoch nicht, diese Feldwerte zuzuweisen.
Devy
4

Für mich scheint dieser Fehler durch falsche Pfaderstellung beim Ausführen des Befehls in Windows Server 2012 verursacht worden zu sein. C:\OpenSSL-Win32\bin

openssl req -new -sha256 -key private.pem -out example.csr

die einen nicht blockierenden Fehler ausgeben, bevor sie nach einem Bestanden fragen:

C: \ Programme (x86) \ Gemeinsame Dateien \ SSL / openssl.cnf kann nicht zum Lesen geöffnet werden. Keine solche Datei oder kein solches Verzeichnis

Offensichtlich ist der Pfad wegen des falschen Schrägstrichs ungültig, daher muss die Konfigurationsdatei explizit an die Befehlszeile angehängt werden:

openssl req -new -sha256 -key private.pem -config openssl.cfg -out example.csr
Alexei
quelle
Das hat bei mir funktioniert, schön und sauber. Danke vielmals!
Sossenbinder
Obwohl dies zweifellos Ihr Problem löst, hat es nichts mit der ursprünglichen Frage zu tun, abgesehen davon, dass Sie mit OpenSSL arbeiten müssen. (Dies könnte als separate Frage / Antwort besser sein.)
Thanatos
Dies
behebt
1

Dieser ähnliche Fehler:

$ openssl req -x509 -newkey rsa: 4096 -keyout _key.pem -out cert.pem -days 365 -nodes Sie werden aufgefordert, Informationen einzugeben, die in Ihre Zertifikatanforderung aufgenommen werden. Was Sie eingeben möchten, wird als Distinguished Name oder DN bezeichnet. Es gibt einige Felder, aber Sie können einige leer lassen. Bei einigen Feldern wird ein Standardwert angezeigt. Wenn Sie '.' Eingeben, bleibt das Feld leer. ----- Ländername (2-stelliger Code) [AU]: Probleme beim Anfordern eines Zertifikats

(Ubuntu 17.04) bedeutete "Sie müssen hinzufügen

-subj "/C=US/ST=California/L=San Francis co/O=ACME, Inc./CN=*.*.$DOMAIN/"

in die Kommandozeile "FWIW.

Rogerdpack
quelle