Este problema es específico de MinGW / MSYS, que se usa comúnmente como parte del paquete Git para Windows .
La solución es pasar el -subj
argumento al principio //
(barras diagonales dobles) y luego usar \
(barras diagonales inversas) para separar los pares clave / valor. Me gusta esto:
"//O=Org\CN=Name"
Esto luego se pasará mágicamente a openssl
en la forma esperada:
"/O=Org/CN=Name"
Entonces, para responder la pregunta específica, debe cambiar la -subj
línea en su secuencia de comandos a la siguiente.
-subj "//C=GB\ST=someplace\L=Provo\O=Achme\CN=${FQDN}"
Eso deberia ser todo lo que necesitas.
¿Qué es esta magia?
Para aquellos que tengan curiosidad por saber exactamente qué está pasando aquí, puedo explicar este misterio. La razón es que MSYS asume razonablemente que los argumentos que contienen barras son en realidad rutas. Y cuando esos argumentos se pasan a un ejecutable que no se ha compilado específicamente para MSYS (como openssl
en este caso), convertirá las rutas POSIX en rutas Win32 . Las reglas para esta conversión son bastante complejas ya que MSYS hace todo lo posible para cubrir los escenarios más comunes de interoperabilidad. Esto también explica por qué el uso openssl
desde un símbolo del sistema de Windows ( cmd.exe
) funciona bien, porque no se realizan conversiones mágicas.
Puede probar la conversión de esta manera.
$ cmd //c echo "/CN=Name"
"C:/Program Files (x86)/Git/CN=Name"
No podemos usar el echo
ejecutable que viene con MSYS ya que fue compilado para MSYS, en su lugar usaremos el echo
incorporado cmd
. Tenga en cuenta que, dado que los cmd
interruptores comienzan con /
(común para los comandos de Windows), debemos manejar eso con barras dobles. Como podemos ver en la salida, el argumento se expandió a una ruta de Windows y queda claro por qué openssl
afirma eso Subject does not start with '/'.
.
Veamos algunas conversiones más.
$ cmd //c echo "//CN=Name"
/CN=Name
Las barras dobles hacen que MSYS crea que el argumento es un cambio de estilo de Windows que da como resultado la eliminación de un /
solo (sin conversión de ruta). Pensaría que con esto podríamos usar barras diagonales para agregar más pares clave / valor. Probemos eso.
$ cmd //c echo "//O=Org/CN=Name"
//O=Org/CN=Name
De repente, las barras dobles al principio no se reducen. Esto se debe a que ahora, con una barra después de las barras dobles iniciales, MSYS cree que estamos haciendo referencia a una ruta UNC (por ejemplo, // servidor / ruta). Si se le pasara openssl
esto, se omitiría la primera clave / valor diciendo Subject Attribute /O has no known NID, skipped
.
Aquí está la regla relevante de la wiki de MinGW que explica este comportamiento:
- Un argumento que comienza con 2 o más / se considera un cambio de estilo de Windows de escape y se pasará con el / eliminado y todo \ cambiado a /.
- Excepto que si hay un / después del bloque inicial de /, el argumento se considera una ruta UNC y el / inicial no se elimina.
En esta regla podemos ver el método que podríamos usar para crear el argumento que queremos. Dado \
que todo lo que sigue en un argumento que comienza con //
se convertirá a simple /
. Probemos eso.
$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name
Y como podemos ver, funciona.
Espero que esto desmitifique un poco la magia.
cat -vet /path/to/script
, y vea si las líneas terminan con '^ M $' (estilo Windows) o simplemente '$' (estilo Unix).