Los certificados de servidor no están correctamente validados por subversion/openssl

Noté que el svn cli no puede validar los certificados https y siempre solicita la validación manual usando la huella digital del certificado:

mbp:~ user$ svn co https://svn.mysite.com/svn/testrepo
Error validating server certificate for 'https://svn.mysite.com:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: svn.mysite.com
 - Valid: from Fri, 21 Jun 2013 00:00:00 GMT until Mon, 20 Jun 2016 23:59:59 GMT
 - Issuer: ANISSUER, DE
 - Fingerprint: 37:7d:6a:a7:e9:4c:30:57:fe:45:32:ab:bb:71:6c:79:08:4d:72:0d

Todos los siguientes clientes pudieron validar el certificado de mi propio servidor svn, así como el de un servidor sf.net :

  • CLI SVN en Linux
  • TortoiseSVN en Windows
  • Safari/Firefox/Chrome en OSX

Las dos versiones de svn cli que probé en OSX (Mountain Lion) y no pude validar los certificados son:

  • /usr/bin/svn: 1.6.18 (r1303927) - León de montaña/Xcode
  • /opt/homebrew/bin/svn: 1.7.9 (r1462340) - Compilado usando homebrew

¿Hay alguna forma de evitar este problema?

Supongo que la causa del problema es que svn cli no puede recoger los certificados raíz en los que confía el sistema operativo. Estos se almacenan en /etc/ssl/certsDebian, pero no tengo idea de su paradero en OSX.

Respuestas (1)

Un amigo (que fue demasiado perezoso para escribir la respuesta aquí) me insinuó que los certificados raíz en Mac OSX están almacenados en el llavero y sugirió dos formas diferentes de solucionar el problema.

Para crear una biblioteca de openssl (utilizada por svn) para ubicarlos, debe exportarlos manualmente y almacenarlos en formato /System/Library/OpenSSL/cert.pm. El proceso se describe paso a paso en la siguiente publicación de blog: http://jw35.blogspot.gr/2011/02/root-certificates-for-macos-openssl.html

Si está utilizando homebrew , una solución alternativa es instalar curl-ca-bundleel paquete y apuntar a openssl a la ubicación de los certificados con el uso de una variable de entorno.

brew install curl-ca-bundle
echo "export SSL_CERT_FILE=$(brew --prefix)/opt/curl-ca-bundle/share/ca-bundle.crt" >> ~/.bashrc
Esto funcionó para mí, pero no solo debe colocar el archivo PEM, /System/Library/OpenSSL/cert.pmsino que también debe crear un archivo llamado [hash].0que contenga los mismos datos (o, mejor aún, crear un enlace simbólico). El [hash]es el hash del certificado que puede obtener ejecutando openssl x509 -hash -noout -in /System/Library/OpenSSL/cert.pem. Esto debería darle un código de 8 caracteres que puede usar para el nombre de archivo de sus enlaces simbólicos (por ejemplo 238dba32.0, donde se .0agrega al hash para crear el nombre de archivo final).