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.

Windows tiene éxito, Android falla en segundos intentos de conexión con el error de Certificado de Servidor Inválido o no presente.

Utilizando C++Builder, necesito crear una pequeña aplicación que obtenga información desde un archivo PHP en un sitio remoto.

Tengo un TRESTClient, TRESTRequest y TRESTResponse configurados correctamente.

Bajo Windows 32-bit, puedo ejecutar repetidamente la siguiente función y obtener datos de vuelta.

Sin embargo, compilado para Android 32-bit, el siguiente código solo funciona la primera vez, devolviendo datos del servidor. Cualquier clic posterior en el botón para volver a entrar en la función genera un error:

‘Certificado del servidor no válido o no presente’

Hay una publicación relacionada en https://stackoverflow.com/questions/69615816/, pero no es de ayuda.

Entonces, en Windows, este código simple funciona correctamente una y otra vez, pero solo una vez en Android antes de fallar.

“`c++
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RESTRequest1->Resource = "";
RESTRequest1->Method = TRESTRequestMethod::rmPOST;
RESTRequest1->Response = RESTResponse1;
RESTRequest1->Response->ContentType = "application/json";
RESTRequest1->Response->ContentEncoding="UTF-8";
RESTRequest1->Execute();

<pre><code>Memo1->Lines->Add(RESTResponse1->Content);
</code></pre>

}
“`

No estoy seguro de cómo evitar este error.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para que la aplicación de C++Builder funcione en Android

    El problema parece estar relacionado con la validación de certificados SSL/TLS en Android. La primera vez que ejecutamos la función, el certificado se valida correctamente, pero las ejecuciones posteriores fallan.

    Para solucionar esto, necesitamos desactivar la validación de certificados SSL/TLS en Android. Esto se puede hacer agregando el siguiente código antes de ejecutar la solicitud REST:

    “`c++
    #if defined(ANDROID)
    // Desactivar la validación de certificados SSL/TLS en Android
    RESTClient1->AcceptEncoding = “identity”;
    RESTClient1->SetSSLCertFile(“”);
    #endif


    Este código establece el atributo `AcceptEncoding` en `identity`, lo que le indica al servidor que no aceptamos respuestas comprimidas. Esto es importante porque las respuestas comprimidas no pueden ser validadas por la implementación SSL/TLS de C++Builder. También establecemos el archivo de certificado SSL en una cadena vacía, lo que eficazmente desactiva la validación de certificados SSL/TLS. El código final debería verse así: ```c++ void __fastcall TForm1::Button1Click(TObject *Sender) { #if defined(__ANDROID__) // Desactivar la validación de certificados SSL/TLS en Android RESTClient1->AcceptEncoding = "identity"; RESTClient1->SetSSLCertFile(""); #endif RESTRequest1->Resource = ""; RESTRequest1->Method = TRESTRequestMethod::rmPOST; RESTRequest1->Response = RESTResponse1; RESTRequest1->Response->ContentType = "application/json"; RESTRequest1->Response->ContentEncoding="UTF-8"; RESTRequest1->Execute(); Memo1->Lines->Add(RESTResponse1->Content); }

    Con estos cambios, la aplicación de C++Builder debería funcionar correctamente en Android, permitiendo múltiples ejecuciones de la solicitud REST sin errores de validación de certificados SSL/TLS.

Comments are closed.