¿Cómo puedo recuperar una URL HTTPS en Mac OS X sin advertencias sobre una autoridad no confiable?

7

El siguiente código debería, en principio, devolver el contenido de https://badssl.com

(with-current-buffer
    (url-retrieve-synchronously "https://badssl.com")
  (buffer-string))

Pero con mi GNU Emacs 25.0.50.1 (x86_64-apple-darwin13.4.0, NS appkit-1265.21 Version 10.9.5 (Build 13F1112)) of 2015-08-24en OS X 10.10.5, ejecutar con -Q, en su lugar me muestra este mensaje:

Certificate information
Issued by:          COMODO RSA Domain Validation Secure Server CA
Issued to:          Domain Control Validated
Hostname:           *.badssl.com
Public key:         RSA, signature: RSA-SHA256
Protocol:           TLS1.2, key: ECDHE-RSA, cipher: AES-128-GCM, mac: AEAD
Security level:     Medium
Valid:              From 2015-04-09 to 2016-07-07


The TLS connection to badssl.com:443 is insecure for the following
reasons:

the certificate was signed by an unknown and therefore untrusted authority
certificate could not be verified

y pregunta si acepta el certificado - No / Sesión / Siempre. Entonces funciona si acepto el certificado.

No tengo el mismo problema con, por ejemplo, wget. Wget descarga correctamente (sin hacer la pregunta) https://badssl.com y rechaza https://self-signed.badssl.com .

Además, parece haber dos grupos de personalización separados: gnutls y tls. Anteriormente he compilado emacs con soporte para gnutls ( gnutls-available-pdevoluciones t). Gnutls se instaló con homebrew.

Si configuro gnutls-verify-errora t, en su lugar obtengo el error

gnutls-negotiate: Certificate validation failed badssl.com, verification code 42

así que presumiblemente no se usaba gnutls en el primer ejemplo. En OS X, ninguno de los archivos mencionados en gnutls-trustfiles(en /usr/ssly /etc/ssl) existe.

Entonces, ¿cómo puedo configurar emacs para usar los certificados raíz de confianza predeterminados en OS X?

Editar: si instalo libressldesde homebrew y agrego /opt/brew/etc/libressl/cert.pema gnutls-trustfiles, el problema desaparece cuando utilizo gnutls-verify-errorset to t.

Edición 2: en mis pruebas, no parecía que el valor de tls-certtool-programrealmente se usara, pero de todos modos puede ser incorrecto para OS X: la herramienta de certificación predeterminada en OS X no es la herramienta de certificación GnuTLS requerida por tls.el, y con gnutls de homebrew Creo que debería ser gnutls-certtool en su lugar.

Kirill
fuente
No puedo reproducir este comportamiento con el tronco Emacs actual. El tuyo es bastante viejo, por favor construye el tronco actual e inténtalo de nuevo.
@lunaryorn Me sale el mismo problema con el tronco actual.
Kirill
¿Cómo construiste Emacs? En particular, ¿qué banderas usaste?
@lunaryorn ../emacs/configure --with-ns CPPFLAGS=-I/opt/brew/include LDFLAGS=-L/opt/brew/lib( ../emacssiendo un clon de git://git.savannah.gnu.org/emacs.git) entonces makey make install. La salida de configuración dice que usa -lgnutls.
Kirill
@lunaryorn ¿Obtiene un error (como se esperaba) al conectarse a expired.badssl.com o self-signed.badssl.com en lugar de badssl.com en el ejemplo?
Kirill

Respuestas:

8

Añadir /private/etc/ssl/cert.pema gnutls-trustfiles:

  1. M-x personalizar-variable
  2. Customize variable: gnutls-trustfiles
  3. Selecciona el último [INS]
  4. Bundle filename: /private/etc/ssl/cert.pem
  5. Seleccione [ Apply and Save ]
Daniel Le
fuente
4

Para resolver este problema, parece suficiente:

  • Establecer gnutls-verify-erroren ty
  • Agregue un archivo de certificado raíz de confianza apropiado a gnutls-trustfiles: la configuración predeterminada para esa lista no incluye ningún archivo existente en OS X y no parece ser el uso predeterminado del llavero del sistema.

Esto se puede hacer, por ejemplo, instalando libressldesde homebrew y agregando el archivo $(brew --prefix)/etc/libressl/cert.pem: homebrew dice que este archivo se creó a partir del llavero del sistema. Establecer la variable gnutls-log-levelen un valor positivo muestra que realmente usa ese archivo.

Nota: Con esta configuración, recibo un mensaje adicional no relacionado de gnutls que dice

gnutls.c: [auditoría] Tenga en cuenta que el nivel de seguridad del intercambio de claves Diffie-Hellman se ha reducido a 256 bits y esto puede permitir el descifrado de los datos de la sesión

Esto se puede solucionar estableciendo gnutls-min-prime-bitsun valor superior al valor predeterminado de emacs (256) y superior a lo que gnutls considera inseguro (768) como 3072, consulte http://gnutls.org/manual/html_node/Selecting-cryptographic-key- tamaños.html así como http://www.keylength.com/en/3/ : esto establece el tamaño mínimo de grupo para el intercambio de claves Diffie-Hellman.

Kirill
fuente
2
¿Hay algún plan para que Emacs funcione correctamente de forma predeterminada? Esto parece una gran cantidad de trabajo.
Radon Rosborough
0

Agregar /private/etc/ssl/cert.pemparece hacer el trabajo.

Canatella
fuente
55
Por favor aclare cómo / dónde agregarlo, y aclare qué es "eso" (¿quiere decir un archivo o un nombre de archivo?),
Stefan