Dieses Problem ist spezifisch für MinGW / MSYS, das üblicherweise als Teil des Git für Windows- Pakets verwendet wird.
Die Lösung besteht darin, das -subj
Argument mit führenden //
(doppelte Schrägstriche) zu übergeben und dann \
die Schlüssel / Wert-Paare mit (umgekehrten Schrägstrichen) zu trennen. So was:
"//O=Org\CN=Name"
Dies wird dann auf magische Weise openssl
in der erwarteten Form weitergegeben:
"/O=Org/CN=Name"
Um die spezifische Frage zu beantworten, sollten Sie die -subj
Zeile in Ihrem Skript wie folgt ändern .
-subj "//C=GB\ST=someplace\L=Provo\O=Achme\CN=${FQDN}"
Das sollte alles sein, was Sie brauchen.
Was ist das für eine Magie?
Für diejenigen, die genau wissen wollen, was hier vor sich geht, kann ich dieses Rätsel erklären. Der Grund dafür ist, dass MSYS vernünftigerweise davon ausgeht, dass Argumente, die Schrägstriche enthalten, tatsächlich Pfade sind. Wenn diese Argumente an eine ausführbare Datei übergeben werden, die nicht speziell für MSYS kompiliert wurde (wie openssl
in diesem Fall), werden POSIX-Pfade in Win32-Pfade konvertiert . Die Regeln für diese Konvertierung sind recht komplex, da MSYS sein Bestes versucht, die gängigsten Szenarien für die Interoperabilität abzudecken. Dies erklärt auch, warum die Verwendung openssl
an einer Windows-Eingabeaufforderung (cmd.exe
) gut funktioniert, da keine magischen Konvertierungen vorgenommen werden.
Sie können die Konvertierung folgendermaßen testen.
$ cmd //c echo "/CN=Name"
"C:/Program Files (x86)/Git/CN=Name"
Wir können die echo
mit MSYS echo
gelieferte ausführbare Datei nicht verwenden , da sie für MSYS kompiliert wurde. Stattdessen verwenden wir die integrierte Datei cmd
. Beachten Sie, dass wir , da cmd
Schalter mit beginnen /
(häufig für Windows-Befehle), dies mit doppelten Schrägstrichen behandeln müssen. Wie wir in der Ausgabe sehen können, wurde das Argument zu einem Windows-Pfad erweitert, und es wird klar, warum openssl
dies tatsächlich behauptet wird Subject does not start with '/'.
.
Sehen wir uns noch einige Conversions an.
$ cmd //c echo "//CN=Name"
/CN=Name
Doppelte Schrägstriche lassen MSYS glauben, dass das Argument ein Windows-Stilschalter ist, der dazu führt, dass /
nur ein Strip entfernt wird (keine Pfadkonvertierung). Sie würden denken, dass wir damit nur Schrägstriche verwenden könnten, um weitere Schlüssel / Wert-Paare hinzuzufügen. Lass es uns versuchen.
$ cmd //c echo "//O=Org/CN=Name"
//O=Org/CN=Name
Plötzlich werden die doppelten Schrägstriche am Start nicht mehr reduziert. Dies liegt daran, dass MSYS jetzt mit einem Schrägstrich nach den anfänglichen doppelten Schrägstrichen denkt, dass wir auf einen UNC-Pfad verweisen (z. B. // Server / Pfad). Wenn dies an übergeben openssl
würde, würde es den ersten Schlüssel / Wert-Spruch überspringen Subject Attribute /O has no known NID, skipped
.
Hier ist die relevante Regel aus dem MinGW-Wiki , die dieses Verhalten erklärt:
- Ein Argument, das mit 2 oder mehr / beginnt, wird als Escape-Schalter im Windows-Stil betrachtet und mit dem führenden / entfernten und allen \ geändert in / übergeben.
- Mit der Ausnahme, dass bei einem / nach dem führenden Block von / das Argument als UNC-Pfad betrachtet wird und das führende / nicht entfernt wird.
In dieser Regel sehen wir die Methode, mit der wir das gewünschte Argument erstellen können. Da alles \
, was in einem Argument folgt, das mit beginnt, in //
normal konvertiert wird /
. Probieren wir das aus.
$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name
Und wie wir sehen können, funktioniert es.
Hoffe das entmystifiziert die Magie ein wenig.
cat -vet /path/to/script
, und prüfen Sie, ob die Zeilen mit '^ M $' (Windows-Stil) oder nur mit '$' (Unix-Stil) enden.