Ver Mensaje Individual
  #3  
Antiguo 30-06-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Reputación: 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