Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por sglorka Ver Mensaje
Parece que el problema puede ser de acceso al almacén de certificados. Ten en cuenta que Localsystem sólo tiene acceso al almacén de certificados local (LocalMachine ) y si no lo tienes ahí pueden haber problemas. Escribe un log donde puedas ver si el servicio puede hacer un acceso a Internet ( por ejemplo con un ping), si lo puede hacer, tiene todas las papeletas de que es problema de certificado. Debes registrar entonces el certificado en dicho almacén
Como alternativa prueba con NetworkService. Si ninguna de estas te funciona, sólo puedes ejecutarlo con una cuenta de usuario.
En mi caso yo realizo el mismo proceso que tú con el servicio pero lo hago en un entorno .Net
Hola sglorka, gracias por contestar.
He comprobado desde el servicio que si que tengo acceso a internet,, en cuanto al certificado,, es el de pruebas de la agencia tributaria , aunque tambien he probado con el mio personal,, si que lo detecta, utilizo esta función para buscar el certificado
Código Delphi [-]

    CERT_STORE_PROV_SYSTEM = 'System';
    CERT_SYSTEM_STORE_CURRENT_USER = $00010000;
    CERT_SYSTEM_STORE_LOCAL_MACHINE = $00020000;
function Buscar_Certificado_Serial2(const Nombre_Certificado: String): string;
var
  hStore: HCERTSTORE;
  CurContext: PCCERT_CONTEXT;
  cbSize: DWORD;
  sNombre: string;

  function BuscarEnAlmacen(dwFlags: DWORD): string;
  begin
    Result := '';
    hStore := CertOpenStore(
      CERT_STORE_PROV_SYSTEM,
      0,
      0,
      dwFlags,
      PChar('MY')
    );
    if hStore = nil then Exit;

    CurContext := nil;
    repeat
      CurContext := CertEnumCertificatesInStore(hStore, CurContext);
      if CurContext = nil then Break;

      cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
      if cbSize > 1 then
      begin
        SetLength(sNombre, cbSize - 1);
        CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(sNombre), cbSize);
        if SameText(Trim(sNombre), Trim(Nombre_Certificado)) then
        begin
          Result := GetCertSerialNumber(@CurContext^.pCertInfo^.SerialNumber);
          Break;
        end;
      end;
    until False;

    CertCloseStore(hStore, 0);
  end;

begin
  Result := BuscarEnAlmacen(CERT_SYSTEM_STORE_CURRENT_USER);
  if Result = '' then
    Result := BuscarEnAlmacen(CERT_SYSTEM_STORE_LOCAL_MACHINE);
end;

con esta función si que me encuentra el certificado y me lo asigna a la propiedad serialnum del httprio. El certificado lo he instalado tanto en el usuario como en el equipo, lo único destacable es que cuando funciona (utilizándolo desde una aplicación de escritorio me lo localiza en : CERT_SYSTEM_STORE_CURRENT_USER y cuando no funciona (servicio), me lo encuentra en: CERT_SYSTEM_STORE_LOCAL_MACHINE

Chatgpt dice esto del componente httprio que está basado en la unidad WinInet: WinINet no está recomendado para servicios Windows: no es thread-safe, no funciona bien en servicios o contextos sin UI., recomienda el uso para servicios de los componentes: TNetHTTPClient + TNetHTTPRequest
Este es el cliente HTTP moderno basado en la API de sockets de bajo nivel.
El problema es que me tocaria gestionar el xml casi a mano,y luego pelearme con el certificado...
Responder Con Cita
  #2  
Antiguo 30-06-2025
sglorka sglorka is offline
Miembro
 
Registrado: mar 2017
Ubicación: Tenerife
Posts: 550
Poder: 10
sglorka Va por buen camino
Prueba a utilizar el certificado en .pfx para el servicio poniendo tu la contraseña por código sin tener que acceder al almacén
Responder Con Cita
  #3  
Antiguo 01-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por sglorka Ver Mensaje
Prueba a utilizar el certificado en .pfx para el servicio poniendo tu la contraseña por código sin tener que acceder al almacén
Hola sglorka,,, no ha funcionado.
seguir buscando,,, ´gracias
Responder Con Cita
  #4  
Antiguo 01-07-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.441
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo te iba a decir que probaras en la misma línea de [sglorka].
Nosotros también hemos tenido problemas con el servicio en relación a los certificados.
El mismo certificado hay que instalarlo en el almacén del usuario (para cuando probamos con la App de envío) y en el almacén de la máquina (para cuando realizamos el envío con el Servicio).
El código de la App y del servicio son iguales, pues comparten una DLL que tiene el código, pero cada uno necesita el certificado en un lugar diferente (por la cuenta con la que se ejecutan).

Ten en cuenta que si lo haces así, el acceso al almacén de certificados de la maquina, necesita una cuenta con "permisos elevados" (al menos en nuestro caso)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 01-07-2025
ISCOPYME ISCOPYME is offline
Miembro
 
Registrado: jun 2004
Posts: 21
Poder: 0
ISCOPYME Va por buen camino
Ese mismo problema lo tuve al implementar en envío mediante servicio windows.
En mi caso detecté que no llegaba a lanzarse el evento OnNeedClientCertificateHandler del httprio.
En cuanto cambié el usuario que iniciaba el servicio a uno con privilegios funcionó correctamente.
Responder Con Cita
  #6  
Antiguo 01-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Gracias por responder
Entiendo que aunque se cargara el certificado de manera dinámica desde un fichero nos pasaria lo mismo, problemas de permiso del usuario que arranca el servicio.
Por lo que comentáis parece ser que se tendrá que hacer eso, aunque es un problema en un contexto de instalar ese servicio en muchos clientes,, en fin.
Queria hacer una prueba sin utilizar componentes httprio, utilizando los componentes nethttpclient ,httprequest,etc... pero creo que tendria el mismo problema
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Verifactu o por requerimiento (no-verifactu) ¿decisión del usuario? Maska10 Temas legales 2 07-12-2024 12:34:47
Depurar aplicacion en modo servicio jlrbotella API de Windows 7 17-07-2015 22:43:29
Problemas con Proftp modo pasivo hexxa Linux 0 06-06-2008 18:49:10
problemas al integrar una aplicación dentro de otra aranel Varios 1 23-10-2005 01:40:00


La franja horaria es GMT +2. Ahora son las 02:40:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi