Problema de verificación SSL de Excon para ONEBOX

Hola a todos,

Acabo de configurar y comenzar a probar un servidor Discourse y, hasta ahora, es excelente. Tengo un problema donde onebox falla debido a lo que creo que es un filtro de inspección SSL que no logra verificarse con la gem excon. He descargado el certificado raíz personalizado y lo he agregado a /etc/ssl/certs en el host, e incluso dentro del contenedor (para probar), pero sin éxito. Todavía obtengo el siguiente error en /log/rails/production.log cada vez que pego una URL para incrustar.

Failed to onebox [youtube url] SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError) Unable to verify certificate.

Se menciona cambiar los valores predeterminados de excon para apuntar a una ruta SSL diferente, pero no estoy seguro de cómo hacerlo de manera segura y aún permitir que Discourse se actualice. ¿Alguien puede aconsejar cómo podría asegurarme de que un certificado raíz personalizado se considere válido dentro de excon? ¿Existe un comando rails -r exec que pueda agregar en app.yml?

Muchas gracias,

Glenn.

¿Qué URL muestra el problema? ¿Estás utilizando la instalación oficial de Discourse basada en Docker?

Parece que, por defecto, excon incluye su propio paquete de certificados, pero como otras personas tuvieron problemas similares, se añadió la capacidad de configurarlo en el entorno. ¿Y utilizará el del sistema si el certificado está correctamente instalado?

Es posible que necesite que el enlace hash funcione. ¿Puedes probar lo siguiente y ver si resuelve el problema?

  • Haz ambas cosas:
    • Añade tu certificado personalizado a /etc/ssl/certs dentro del contenedor.

    • Añade el enlace hash, por ejemplo:

      ln -s my_custom_cert.pem /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/my_custom_cert.pem).0
      

Gracias, Michael,

He configurado la variable de entorno y creado el hash, y ahora no veo ningún error de SSL visible, pero onebox sigue sin hacer nada. No sé si Jeff tiene algún consejo sobre lo que podría estar haciendo mal? @codinghorror.

Me preocupa que hacer cambios dentro del contenedor simplemente se pierda al reconstruirlo, así que no estoy seguro de cuál es el mejor enfoque aquí.

Glenn.

Puede que haya almacenado en caché el fallo, pero probemos una cosa a la vez.

No deberías necesitar agregar la variable de entorno, pero puedes verificar si agregar el certificado funcionó haciendo, por ejemplo:

root:~# /var/discourse/launcher enter app
root@app:/var/www/discourse# rails console
[1] pry(main)> Net::HTTP.get URI 'https://meta.discourse.org/about.json'

Si obtienes un resultado (y antes no lo tenías), eso significa que el certificado está instalado correctamente. Luego puedes agregar comandos a la definición del contenedor para instalar ese certificado en cada reconstrucción, de modo que persista.

Gracias, Michael. El comando de consola de Rails funcionó bien; pudo descargar el archivo JSON al que vinculaste.

No estoy seguro de si no habría funcionado antes, pero previamente había instalado el certificado raíz en /etc/ssl/certs/ y aun así no funcionaba.

Ejecuté export SSL_CERT_DIR=“/etc/ssl/certs/” en el contenedor y el error de SSL pareció desaparecer después de eso. Al menos ya no veo nada en production.log.

Gracias,

Glenn.

En realidad, creo que ya he resuelto el problema. Se trata de un mensaje de autenticación relacionado con el filtro corporativo, según creo. Ejecuté Net::HTTP.get en la consola usando una URI de oembed de YouTube para obtener el JSON incrustado, pero en su lugar me devolvió un documento HTML de autenticación. Así que creo que eso es lo que está interfiriendo ahora. Muchas gracias, Michael.

¿También creaste el enlace simbólico? Esa es una parte muy importante.

Para que el certificado quede permanentemente en su lugar, debes modificar el archivo app.yml agregando o ajustando una sección hooks de la siguiente manera:

hooks:
  before_code:
    - file:
        path: /etc/ssl/certs/custom-root.crt
        chmod: 644
        contents: |
          -----BEGIN CERTIFICATE-----
          …
          -----END CERTIFICATE-----
    - exec:
        cmd:
          - bash -c "ln -s custom-root.crt /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/custom-root.crt).0"

Ah, probablemente no haya nada que podamos agregar al archivo app.yml para solucionar eso.