Cómo arreglar curl: (60) Certificado SSL: cadena de certificados no válida cuando se usa sudo

Entonces, dado que la actualización de Mavericks, curl 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 curvo un archivo se descarga correctamente.

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

¿Supongo que la raíz no lee desde el llavero del sistema tal vez?

¿Alguien sabe una manera de arreglar esto?

Respuestas (6)

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 configurar esto de forma permanente, debe crear un .curlrcarchivo y colocarlo en su directorio de inicio. sudolos comandos pueden necesitar este archivo en /var/rootEl archivo tiene 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
Gracias por su respuesta, la secuencia de comandos que se ejecuta 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 a nivel mundial?
Puede crear un archivo .curlrc y almacenarlo en su carpeta de inicio, aunque al usar sudo es posible que deba ser /var/root/.curlrc. El archivo debe contener opciones sin guiones, una por línea. Entonces "cacert=/ruta/a/mi/certificados.pem"
+1 para configurar un root-disponible .curlrcen lugar de --insecure. Que es exactamente como dice: para que un atacante en la posición de la red lo haga, sería trivial para MITM e inyectar código.
Gracias por esto, suena como lo que estoy buscando. Lo intentaré mañana y otorgaré una recompensa si funciona.

Root no lee la configuración de confianza del usuario actual, pero hay configuraciones de confianza de administrador y configuraciones de confianza específicas del usuario root. (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 de confianza 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 ahora puede adivinar, es cualquiera de sudolas anteriores, que luego lo marcan como de confianza para el usuario raíz específicamente:

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

o para usar la -dbandera para agregarla a la configuración de confianza del administrador:

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

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

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

Como dije en la pregunta, los he agregado al llavero del sistema, así como al llavero de inicio de sesión.
¿De verdad intentaste lo que te sugerí? Lo probé, exactamente en la situación que describes, 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 simplemente agregar el certificado a un llavero, y que la configuración de confianza del certificado de administrador existe por separado del sistema y configuración de usuario/llaveros. (También parece haber un conjunto de configuraciones de usuario específicas del usuario raíz en la mezcla). He editado mi respuesta para ser más claro en este punto. Por favor, pruebe esta solución.
Sí, probé esta solución cuando la publicaste por primera vez. Los certificados están en el llavero del sistema y están configurados como confiables. Todavía no hay suerte.

Esto es realmente en la sugerencia 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 que no son de confianza.

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

certsynces una herramienta y un plist de inicio 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.

Gracias por esto, aunque me gustaría evitar usar MacPorts si es posible.

La documentación que buscas está aquí. Explica cómo usar cURL en Mavericks y cómo proporcionar sus certificados: http://curl.haxx.se/mail/archive-2013-10/0036.html

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

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

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

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

me sale el errorSecCertificateCreateFromData: Unknown format in import.
Cualquiera que haya votado negativo, tenga en cuenta que claramente escribí "en OSX Sierra" y esta fue una solución funcional para nosotros. Si no funciona en las versiones más nuevas 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).