2012-04-10 9 views
9

¿Hay alguna manera de configurar un contexto de OpenSSL (SSL_CTX) con un conjunto razonable de certificados de CA confiables sin distribuyéndolos yo mismo? No quiero la responsabilidad de mantenerlos actualizados. OMI cualquier sistema operativo moderno debería proporcionar "obtener los certificados de CA de confianza" como un servicio, pero no sé si ese es realmente el caso.Valor predeterminado razonable de OpenSSL para certificados de CA confiables?

No me importa escribir este código tres veces (una para Windows, una para Mac OS X y una para Linux), pero prefiero limitarla a eso. En particular, prefiero no intentar escribir un código que husmee en buscar qué navegadores están instalados e intentar extraer sus certificados confiables. (Aparentemente es easy to get this very wrong.)

La respuesta para las versiones recientes de Linux parece ser llamar al SSL_CTX_load_verify_locations con /etc/ssl/certs/ca-certificates.crt (si ese archivo existe).

¿Hay respuestas simples para Windows y Mac OS X?

Respuesta

5

En OS X, puede obtener información sobre los certificados de confianza del usuario del llavero del usuario. Aquí hay un enlace que contiene muy buena información en la recogida de esa información utilizando cacao:

Get Certificates in Keychain

Si cacao no es una dependencia bien para sus necesidades, y que desea hacer todo directamente desde la línea de comandos, usted podría utilice la utilidad certtool; consulte man certtool y otra documentación en línea para obtener más información al respecto. Para una lista de todos los certificados de llave de acceso del usuario, es posible hacer:

certtool y k=login.keychain 

o para obtener una lista de los incorporados en las raíces del sistema de confianza:

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain 

y tal vez

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain 

Estoy seguro de que hay otras maneras de obtener esa información usando las interfaces del sistema también.

En el lado de Linux, sí, /etc/ssl/certs/ca-certificates.crt es el camino correcto a seguir. Ese archivo existirá en los derivados de Debian (incluidas las variantes de Ubuntu) cuando se instala el paquete ca-certificates, y no estoy seguro de cómo hacerlo correctamente en los sistemas basados ​​en redhat.

+0

¿Sabe cómo 'certtool' se comporta para los certificados que se marcan explícitamente como" nunca confían "? – Bruno

+0

No creo que certtool muestre nada sobre los niveles de confianza; querrías consultar la confiabilidad usando un mecanismo diferente. Pruebe 'man security' de una buena manera, si realmente está usando las herramientas de línea de comandos para esto. –

+1

Vea también la utilidad certsync de MacPorts (https://trac.macports.org/browser/trunk/dports/security/certsync/#files, el código real está en 'files/certsync.m'), que también exporta los archivos de confianza arraiga en un archivo y presta atención a los indicadores de confianza (al no exportarlos). – neverpanic

7

Esto es lo que terminé haciendo:

En Windows: obtener los certificados del almacén de certificados de Windows "ROOT" usando CertOpenSystemStore, bucle sobre ellos utilizando CertEnumCertificatesInStore, agarrar el certificado crudo codificado-X509 desde el campo de la CERT_CONTEXTpbCertEncoded , cree una estructura OpenSSL X509 utilizando d2i_X509 y agréguela al almacén de certificados OpenSSL utilizando X509_STORE_add_cert. Las funciones de Windows están todas disponibles en crypt32.dll.

En Mac OS X: obtener los certificados del llavero "/System/Library/Keychains/SystemRootCertificates.keychain" usando SecKeychainOpen, crear un iterador de los certificados en el llavero utilizando SecKeychainSearchCreateFromAttributes, iterar usando SecKeychainSearchCopyNext, obtener el certificado X509 cruda usando SecItemExport, crear un certificado de OpenSSL utilizando d2i_X509, y agréguelo a la tienda OpenSSL usando X509_STORE_add_cert. Las funciones de Mac están disponibles en /Systems/Library/Frameworks/Security.framework/Security.

Un mejor enfoque podría ser crear un OpenSSL X509_STORE con una devolución de llamada que use las funciones del sistema operativo para verificar un certificado raíz individual, en lugar de copiarlos todos, pero no lo he intentado.

+0

¿Puedes compartir el código? – proteneer

+0

@proteneer, el código ahora es parte de la biblioteca Racket openssl aquí: https://github.com/plt/racket/tree/master/racket/collects/openssl/private –

Cuestiones relacionadas