 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 02 Abr, 2018 9:13 pm Asunto: https. Por favor necesito ayuda |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 03 Abr, 2018 8:57 am Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 03 Abr, 2018 1:19 pm Asunto: |
|
|
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 |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Lun 28 May, 2018 6:06 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 30 May, 2018 2:37 am Asunto: |
|
|
| 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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 12 Dic, 2018 2:25 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 14 Dic, 2018 4:25 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|