Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2023
isnagil isnagil is offline
Miembro
 
Registrado: jun 2010
Posts: 39
Poder: 0
isnagil Va por buen camino
Leer certificado pfx para webservice

Hola buenas tardes:

Mi problema es el siguiente:

Quiero cargar un certificado pfx sin tenerlo instalado en windows para utilizarlo en un componente HTTPRio y acceder a un webservice.
Estoy usando RAD STUDIO 10.4

He estado buscando en el foro y ya hay un tema al respecto:

https://www.clubdelphi.com/foros/showthread.php?t=95356

La cuestión es que no puedo usar CAPICOM. En este tema se ofrece una solución utilizando la unidad JwaWinCrypt.

He buscado información y creo que esta unidad está en el componente JWAPI pero no sé como obtenerlo ni como instalarlo.

¿Alguien me puede ayudar, por favor?

Gracias
Responder Con Cita
  #2  
Antiguo 27-09-2023
Garada Garada is offline
Miembro
 
Registrado: jul 2004
Posts: 66
Poder: 20
Garada Va por buen camino
Buenas.

En el ejemplo que puse en el otro hilo comentaba que la mayoría de las funciones estaban declaradas en la unidad CertHelper de Delphi 2010, prueba a ver si existe la unidad en 10.4 y dime que funciones te faltan y te paso las declaraciones.
Responder Con Cita
  #3  
Antiguo 27-09-2023
Garada Garada is offline
Miembro
 
Registrado: jul 2004
Posts: 66
Poder: 20
Garada Va por buen camino
Lo revisé un poco y aquí te dejo una versión probada en Delphi 2010 usando sólo la unidad CertHelper que ya viene de serie.

Código Delphi [-]
uses
  CertHelper, WinInet;

function PFXImportCertStore(var pPFX: CRYPT_BIT_BLOB;
                          szPassword: LPCWSTR;
                          dwFlags: DWORD): HCERTSTORE; stdcall; external 'Crypt32.dll';

procedure TformMain.HTTPRIO1HTTPWebNode1BeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);

  procedure CheckError(Puntero: Pointer);
  begin
    if not Assigned(Puntero) then
      RaiseLastOSError;
  end;


const
  INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
  PKCS12_INCLUDE_EXTENDED_PROPERTIES  = $0010;
  CERT_COMPARE_HAS_PRIVATE_KEY        = 21;
  CERT_FIND_HAS_PRIVATE_KEY           = CERT_COMPARE_HAS_PRIVATE_KEY shl CERT_COMPARE_SHIFT;

  Pass = 'LaContraseña';
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_BIT_BLOB;
  PFX: TBytes;
begin
  pStore := nil;
  pCert := nil;

  PFX := TFile.ReadAllBytes('ArchivoDelCertificado.PFX');

  try
    DataBlob.cbData := Length(PFX);
    DataBlob.pbData := @PFX[0];

    // Almacen temporal con el contenido del PFX
    pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), PKCS12_INCLUDE_EXTENDED_PROPERTIES);
    CheckError(pStore);

    // Buscar un certificado con clave privada
    // Solo debería haber uno
    pCert := CertFindCertificateInStore(pStore,
                                        X509_ASN_ENCODING,
                                        0,
                                        CERT_FIND_HAS_PRIVATE_KEY, //CERT_FIND_ANY,
                                        nil,
                                        nil);
    CheckError(pCert);

    // Pasarlo al servicio
    InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT));
  finally
    if Assigned(pCert) then
      CertFreeCertificateContext(pCert);

    if Assigned(pStore) then
      CertCloseStore(pStore, 0);
  end;
end;
Responder Con Cita
  #4  
Antiguo 28-09-2023
isnagil isnagil is offline
Miembro
 
Registrado: jun 2010
Posts: 39
Poder: 0
isnagil Va por buen camino
Muchas gracias Garada, muy amable.

He probado el código y el compilador no reconoce la función InternetSetOption. Seguramente está en otra unidad y me falta añadirla al uses.

InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT));

Tampoco reconoce la variable Data que no sé de donde la sacas porque no está declarada.

Si puedes aclararme esto te estaría muy agradecido.
Responder Con Cita
  #5  
Antiguo 28-09-2023
isnagil isnagil is offline
Miembro
 
Registrado: jun 2010
Posts: 39
Poder: 0
isnagil Va por buen camino
Bueno ya sé de donde vienen la función InternetSetOption. De la unidad WinINet.

Ahora, de momento, solo me falta saber el valor de la variable data para que el procedimiento se pueda compilar.
Responder Con Cita
  #6  
Antiguo 28-09-2023
Garada Garada is offline
Miembro
 
Registrado: jul 2004
Posts: 66
Poder: 20
Garada Va por buen camino
data es un parámetro del evento BeforePost del WebNode del HTTPRIO.

Al menos en D2010 viene declarado así:
Código Delphi [-]
procedure TformMain.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);

Si en D10.4 es diferente pásame la declaración a ver que ha cambiado.
Responder Con Cita
Respuesta



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
acceder a Webservice con certificado de cliente iMia Internet 8 13-09-2022 11:20:58
Conectar Webservice con httpRio+Certificado gasal Internet 2 20-07-2018 17:11:08
Como leer un TRemotable que proviene de un webservice apicito Internet 17 02-09-2011 22:48:41
SOAP POST - Webservice con Certificado y SSL JXJ Varios 5 09-05-2011 20:11:08


La franja horaria es GMT +2. Ahora son las 13:20:03.


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