Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

https. Por favor necesito ayuda

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: https. Por favor necesito ayuda Responder citando

Actualmente accedía a mi web para leer o escribir datos y sin problemas.
Mi sitio Web tiene seguridad SSL.
Pero se puede acceder a ella con http u https.
Para que esto no suceda he creado el fichero en el servidor que redirecciona simpre a https.
fichero: .htaccess con el contenido:
Código:

RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]


En mi programa:
1. Tengo añadido el COMPONENTE TIdSSLIOHandlerSocketOpenSSL y asignadp a la propiedad de TIdHTTP->IOHandler.
2. Tambien tengo las librerias SSL (ssleay32.dll y libeay32.dll) en la carpeta del programa.

El fichero del servidor .htaccess hace su función perfectamente, pero estoy en un dilema...
O dejo que se pueda acceder a mi sitio por http en lugar de obligar a https o mi programa cuando intenta acceder a la web me da error.
Ya lo he intentado todo, pero sigo sin poder solucionarlo.

El código de conexión es este:
Código:

    std::auto_ptr<TIdHTTP> http(new TIdHTTP(0));
    http->Head("https://www.tpvbarman.com/nzw/version_update.dat");
    if(http->ResponseCode == 200)
    {
        std::unique_ptr<TFileStream> fs1(new TFileStream(VersionDescarga.w_str(), fmCreate));//Se necesita #include<memory>
        IdHTTP1->Get("https://www.tpvbarman.com/nzw/version_update.dat", fs1.get());
        fs1.reset();//Si las dos lineas de arriba las pongo entre llaves {} el recurso o fichero se libera al salir de las llaves.
        IdHTTP1->Disconnect();
    }


... y el error que me muestra es:
Código:

IOHandler value is not valid


Si le asigno manualmente esto:

Código:

    std::auto_ptr<TIdHTTP> http(new TIdHTTP(0));
    http->IOHandler = IdSSLIOHandlerSocketOpenSSL1;
    http->Head("https://www.tpvbarman.com/nzw/version_update.dat");
    if(http->ResponseCode == 200)
    {
        std::unique_ptr<TFileStream> fs1(new TFileStream(VersionDescarga.w_str(), fmCreate));//Se necesita #include<memory>
        IdHTTP1->Get("https://www.tpvbarman.com/nzw/version_update.dat", fs1.get());
        fs1.reset();//Si las dos lineas de arriba las pongo entre llaves {} el recurso o fichero se libera al salir de las llaves.
        IdHTTP1->Disconnect();
    }


Me muestra este error:
Código:

[02/04/2018 22:24:12]
Excepcion producida. TPVBarman=Excepcion del Programa
Mensaje Mostrado=Error connecting with SSL.
Formulario Activo=frmComprobacion
Boton Pulsado=ComprobarInternet()
Error E->UnitName() en=IdSSLOpenSSLHeaders
Error Sender->UnitName() en=ExtCtrls
Error E->ClassName()=EIdOSSLUnderlyingCryptoError
Error Sender->ClassName()=TTimer
Error connecting with SSL.
error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error


He probado cambiando la propiedad de
IdSSLIOHandlerSocketOpenSSL1->IOHandler->SSLOptions->Method a:
sslvTLSv1, sslvTLSv2, sslvTLSv23 y sslvTLSv3
... pero sigue sin funionar

Por favor necesito ayuda...
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Hola, asegúrate de que tienes las DLLs en el mismo directorio donde está el ejecutable..

Como no sé qué versión de C++Builder estas utilizando te pongo distintas opciones.

- La más simple, usando el API de Windows (con esta no necesitamos usar las DLLs de OpenSSL):
Código:
// Añadimos:
#include <urlmon.h>
#pragma comment (lib, "urlmon.lib")

String url = "https://www.tpvbarman.com/nzw/version_update.dat";
String file = "d:\\version_update.dat";
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, NULL);

- La que tu estas usando, aunque veo que mezclas partes donde usas el componente creado dinámicamente y el que has arrastrado al Form en tiempo de diseño:
Código:
//Añadimos:
#include <memory>
#include <IdHTTP.hpp>
#include <IdSSLOpenSSL.hpp>

std::unique_ptr<TIdHTTP> http(new TIdHTTP(0));
std::unique_ptr<TIdSSLIOHandlerSocketOpenSSL> ssl(new TIdSSLIOHandlerSocketOpenSSL(0));
http->IOHandler = ssl.get();

http->Head("https://www.tpvbarman.com/nzw/version_update.dat");
if (http->ResponseCode == 200)
{
    std::unique_ptr<TFileStream> fs1(new TFileStream("D:\\version.dat", fmCreate));
    http->Get("https://www.tpvbarman.com/nzw/version_update.dat", fs1.get());
    fs1.reset();
    http->Disconnect();
}

(Aquí seria sin arrastrar ningún componente en tiempo de diseño, si los vas a arrastrar pues más simple, te ahorras todos los unique_ptr.. eso ya es como cada uno prefiera trabajar)

- En las versiones más actuales de Indy no hace falta añadir el "TIdSSLIOHandlerSocketOpenSSL", al ver que la dirección usa el protocolo "https" el mismo ya intenta cargar las DLLs y hacer lo necesario, por lo que se puede resumir lo de arriba en:
Código:
//Añadimos:
#include<memory> 
#include<IdHTTP.hpp>

std::unique_ptr<TIdHTTP> http(new TIdHTTP(0));
http->Head("https://www.tpvbarman.com/nzw/version_update.dat");
if (http->ResponseCode == 200)
{
    std::unique_ptr<TFileStream> fs1(new TFileStream("D:\\version.dat", fmCreate));
    http->Get("https://www.tpvbarman.com/nzw/version_update.dat", fs1.get());
    fs1.reset();
    http->Disconnect();
}


- En las últimas versiones de C++Builder también podemos usar TNetHTTPClient que usa internamente las APIs WinInet y WinHTTP, por lo que no necesitamos usar las DLLs OpenSSL como en el caso de Indy:
Código:
//Añadimos:
#include <memory>
#include <System.Net.HTTPClientComponent.hpp>

std::unique_ptr<TNetHTTPClient> http(new TNetHTTPClient(NULL));
std::unique_ptr<TFileStream> fs1(new TFileStream("d:\\prueba.dat", fmCreate));
http->Get("https://www.tpvbarman.com/nzw/version_update.dat", fs1.get());
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo... No te haces idea de cuanto me has ayudado.
Muchísimas gracias por responder

Por cierto... mi versión de Builder es Studio 2010

Revisare el código junto con tus advertencia y probaré.
Aun no lo he probado, pero seguro que funciona como todo lo que escribes.

Voy a implementar tu código, porque es más elegante y eficaz que la solución TEMPORAL que encontré modificando el fichero .htaccess para que todas las paginas .htm se redirijan a https, pero NO los archivos sin dicha extensión.
De esa forma la Web funcionaria con https siempre, pero cuando accedo desde mi programa al no leer ficheros.htm puedo acceder por http

Fichero .htaccess :
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*.htm$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]


POSDATA:
Acabo de probar la forma simple del primer código que has escrito y funciona perfecto.

Por supuesto con el fichero .htaccess correcto:
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]


IMPRESIONATE...!!!
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

leo.....podrias poner un ejemplo de como utilizar una progress bar para controlar lo que va bajando?

para tener un testigo "visual" de lo que lleva hecho hasta terminar
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Alpinador escribió:
leo.....podrias poner un ejemplo de como utilizar una progress bar para controlar lo que va bajando?

para tener un testigo "visual" de lo que lleva hecho hasta terminar

https://cppbuilder.es/viewtopic.php?t=15011
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Jesus y Leo,

A ver si podéis ayudarme, hago algo parecido a lo que hace Jesus, con un componente IDHTTP pero el metodo POST.

Es para una pasarela de pago de REDSYS, la historia es que cuando envío los datos me devuelve el mismo error que a Jesus:

"Error connecting with SSL"

Que puede estar pasando?, es que el ejemplo que tenéis puesto no consigo pasarlo a un POST, por si acaso también estoy poniendo en el IOHandler el IdSSLIOHandlerSocketOpenSSL

Gracias

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Yo al final opté por la opción:
URLDownloadToFile

porque me canse de Http->Get y no lo conseguía hacer funcionar.

Esto es lo que puse en mi ultimo post de este tema:

POSDATA:
Acabo de probar la forma simple del primer código que has escrito y funciona perfecto.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.