es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter Dio Ignorando la Validación del Certificado HTTPS en onBadCertificate – ¿Problema con el Certificado de CA?

Me he encontrado con un dilema. Estoy escribiendo una aplicación cliente/servidor. El frontend está en Flutter y utiliza el paquete http Dio, el backend está en Java. La API REST del backend está protegida mediante un certificado TLS.

Como se ha señalado en otras preguntas, parece que Flutter no tiene acceso al almacén de certificados CA del sistema en todas las plataformas. Esto es problemático porque pretendo permitir el autoalojamiento de la aplicación del servidor, lo que significa que se podrían utilizar certificados de diferentes CA en el lado del servidor, por lo que mi cliente HTTP deberá admitir todas las CA que admite un navegador web típico.

Al parecer, Dio te permite configurar una cadena de certificados de confianza, pero me pregunto cómo aprovecharlo mejor.

¿Alguien se ha enfrentado a este problema antes? ¿Qué solución implementaste para solucionarlo?

Estas son las soluciones que he pensado hasta ahora:

  1. Permitir al usuario “subir” un paquete de certificados CA y almacenar los bytes en shared_preferences (difícil para los usuarios).
  2. Encontrar otra forma de validar el certificado, por ejemplo, ¿con la huella digital ingresada por el usuario? (menos difícil, dejar que todos los certificados fallen la validación original y luego hacer una validación personalizada con onBadCertificate utilizando la huella digital almacenada).
  3. Encontrar un paquete que ofrezca acceso al almacén de certificados del sistema.
  4. Incluir en la aplicación la mayoría de los certificados CA conocidos y confiar en ellos de alguna manera con Dio.

El otro problema por el que estoy aquí es que Dio parece estar ignorando mi método onBadCertificate. Lo declaré dentro de un ConnectionManager, ¿debería hacerlo de otra forma?

Aquí está el código que está siendo ignorado:

var dio = Dio()
  ..options.baseUrl = servidor
  ..interceptors.add(LogInterceptor())
  ..interceptors.add(CookieManager(cookieJar))
  ..httpClientAdapter = Http2Adapter(
    ConnectionManager(
      idleTimeout: 10000,
      // Ignorar certificado no válido
      onClientCreate: (_, config) => {
        //config.context?.setTrustedCertificatesBytes(File("/assets/certs/wildcard.pem").readAsBytesSync()),
        config.onBadCertificate = (_) => true, // <-- ignorado, debería omitir la verificación
      }
    ),
  );

EDITAR:

Como se menciona en los comentarios, de hecho Flutter es capaz de utilizar el almacén de certificados CA del sistema. A medida que pruebe otras plataformas, actualizaré si encuentro algún problema con los certificados. ¡Pero este problema está resuelto!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Aplicación Cliente/Servidor con Flutter y Backend Java REST API Segura mediante Certificado TLS – Quandary

    Problema

    La aplicación frontend Flutter utiliza el paquete http Dio y el backend Java REST API está asegurada mediante un certificado TLS. Sin embargo, Flutter no tiene acceso al almacén de Certificados de Autoridad (CA) del sistema en todas las plataformas, lo cual es problemático porque los usuarios podrían utilizar certificados de diferentes CAs. Por lo tanto, el cliente HTTP deberá admitir todos los CAs que soporta un navegador web típico.

    Soluciones

    Se han sugerido las siguientes soluciones:

    1. Permitir a los usuarios “subir” conjuntos de certificados de CA y almacenar los bytes en shared_preferences (difícil para los usuarios).
    2. Encontrar otra forma de validar el certificado con la huella digital proporcionada por el usuario (menos difícil; permitir que todos los certificados no pasen la validación original y luego realizar una validación personalizada con el método onBadCertificate usando la huella digital almacenada).
    3. Encontrar un paquete que ofrezca acceso al almacén de certificados del sistema.
    4. Incluir la mayoría de los nombres importantes de CAs dentro de la aplicación y confiar en ellos de alguna manera con Dio.

    Problema de Código

    El método onBadCertificate está siendo ignorado por Dio. Se declaró dentro de un ConnectionManager, pero no está claro si esto es correcto o no.

    var dio = Dio()
      ..options.baseUrl = server
      ..interceptors.add(LogInterceptor())
      ..interceptors.add(CookieManager(cookieJar))
      ..httpClientAdapter = Http2Adapter(
        ConnectionManager(
          idleTimeout: 10000,
          // Ignorar certificado inválido
          onClientCreate: (_, config) => {
            //config.context?.setTrustedCertificatesBytes(File("/assets/certs/wildcard.pem").readAsBytesSync()),
            config.onBadCertificate = (_) => true, // <-- ignorado, debería omitir la comprobación
          }
        ),
      );
    

    Conclusión

    Flutter es capaz de utilizar el almacén de Certificados de Autoridad (CA) del sistema. Las soluciones sugeridas para el problema no son ideales. Sin embargo, el problema de código con onBadCertificate se resolvió eliminando las líneas > y < y config.context? y File() del método onClientCreate.

Comments are closed.