Cómo arreglar curl: (60) certificado SSL: cadena de certificados no válida al usar sudo

12

Entonces, dado que el curl de actualización de Mavericks tiene más problemas con los certificados.

Al intentar curvar un archivo de mi servidor web con su certificado autofirmado, recibía el error "Certificado SSL: cadena de certificados no válida".

Esto se corrigió agregando el certificado al llavero de mi sistema y configurándolo para permitir siempre SSL, información que encontré aquí y aquí .

Esto funciona bien y cuando doblo un archivo, se descarga correctamente.

Sin embargo, si ejecuto curl con sudo antes (por ejemplo, tengo un script que necesita ejecutarse con sudo y hace un curl en él), entonces vuelvo al mismo mensaje de error.

Supongo que quizás la raíz no lea del llavero del sistema.

¿Alguien sabe una manera de arreglar esto?

Jacob Tomlinson
fuente

Respuestas:

17

Si almacena sus certificados de CA en el sistema de archivos (en formato PEM) puede decirle a curl que los use con

sudo curl --cacert /path/to/cacert.pem ...

También puede desactivar la verificación del certificado con

sudo curl --insecure ...

Editar: actualizado con respecto a los comentarios

Si desea configurarlo permanentemente, debe crear un .curlrcarchivo y colocarlo en su directorio de inicio. sudolos comandos pueden necesitar este archivo en /var/rootEl archivo toma las mismas opciones que la línea de comando pero sin los guiones. Una opción por línea:

cacert=/path/to/my/certs.pem
Dan
fuente
Gracias por su respuesta, el script que se está ejecutando con sudo es de un tercero, por lo que realmente no puedo modificar el comando curl en sí. Inseguro no es realmente una opción. ¿Se puede hacer esto globalmente?
Jacob Tomlinson
Puede crear un archivo .curlrc y almacenarlo en su carpeta de inicio, aunque con sudo puede ser /var/root/.curlrc. El archivo debe contener opciones sin guiones, una por línea. Entonces "cacert = / path / to / my / certs.pem"
Dan
1
+1 para configurar un root-disponible en .curlrclugar de --insecure. Lo cual es exactamente como dice: para que un atacante en la posición de red lo haga, sería trivial para MITM e inyectar código.
zigg
Gracias por esto, suena como lo que estoy buscando. Lo intentaré mañana y otorgaré recompensas si funciona.
Jacob Tomlinson
6

La raíz no lee desde la configuración de confianza del usuario actual, pero hay una configuración de confianza de administrador y una configuración de confianza específica del usuario raíz. (Estos también son distintos de la configuración de confianza del sistema ). Tenga en cuenta, también, que la configuración de confianza del certificado es algo distinta de simplemente agregar un certificado a un llavero; puede marcar un certificado como confiable sin agregarlo por completo. (La situación exacta aquí no está clara para mí, y los documentos que he visto son vagos).

Puede marcar un certificado como confiable para su usuario actual como

$ security add-trusted-cert /path/to/cert.pem

Pero eso no ayuda con la raíz. La solución, como puede suponer ahora, es sudola anterior, que la marca específicamente como confiable para el usuario root:

$ sudo security add-trusted-cert /path/to/cert.pem

o para usar el -dindicador para agregarlo a la configuración de confianza del administrador:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X abrirá un cuadro de diálogo de contraseña para confirmar este).

Cualquiera de los dos últimos parece ser suficiente para sudo curl.

Referencia: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html

Wes Campaigne
fuente
Como dije en la pregunta, los he agregado al llavero del sistema, así como al llavero de inicio de sesión.
Jacob Tomlinson
¿Realmente intentaste lo que te sugerí? Lo probé, exactamente en la situación que describiste, y funcionó. No tengo claros todos los detalles, la documentación es vaga, pero debe saber que la configuración de confianza del certificado NO es sinónimo de agregar el certificado a un llavero, y que la configuración de confianza del certificado de administrador existe por separado del sistema y ajustes de usuario / llaveros. (También parece haber un conjunto de configuraciones de usuario específicas del usuario raíz en la mezcla). Edité mi respuesta para que sea más clara en este punto. Por favor, prueba esta solución.
Wes Campaigne
Sí, probé esta solución cuando la publicaste por primera vez. Los certificados están en el llavero del sistema y se configuran como confiables. Aún no hay suerte.
Jacob Tomlinson
5

Esto es realmente en la pista de salida:

echo insecure >> ~/.curlrc

La ventaja de usar la solución anterior es que funciona para todos los curlcomandos, pero no se recomienda ya que puede introducir ataques MITM al conectarse a hosts inseguros y no confiables.

zinc
fuente
2

Si usa MacPorts (y el script de terceros que mencionó no lo elimina $PATHni llama /usr/bin/curl), puede instalar los puertos certsyncy curlen este orden.

certsynces una herramienta y una lista de lanzamiento correspondiente que exportará el llavero de su sistema $prefix/etc/openssl/cert.peme instalará un enlace simbólico $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pempara que MacPorts curl recoja automáticamente los certificados. certsynctambién actualizará automáticamente los archivos generados cuando cambie el llavero de su sistema.

Neverpanic
fuente
Gracias por esto, me gustaría evitar usar MacPorts si es posible.
Jacob Tomlinson
-1

Para hacer el sudo curltrabajo (en OSX Sierra), tuvimos que importar el certificado System.keychainy confiar allí. Esto se puede hacer manualmente en la aplicación Keychain o usando este comando:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Era importante especificar -dy establecer manualmente la ruta al llavero del sistema -kpara asegurarse de que el certificado realmente se importe allí si aún no lo está.

El comando funciona sin él sudo, pero luego solicitaría la contraseña a través de un cuadro de diálogo de la interfaz de usuario, que podría ser un obstáculo para los scripts.

Alexander Klimetschek
fuente
Me sale el errorSecCertificateCreateFromData: Unknown format in import.
rraallvv
Quien haya votado negativamente, sepa que escribí claramente "en OSX Sierra" y que esta fue una solución que funcionó para nosotros. Si no funciona en las versiones más recientes de OSX, podría deberse a que el soporte o las herramientas de OSX han cambiado. O un problema como el comentarista anterior, donde el archivo de entrada no está en un formato compatible (la pregunta no especifica eso).
Alexander Klimetschek,