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
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
  #2  
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
  #3  
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
  #4  
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
  #5  
Antiguo 28-09-2023
isnagil isnagil is offline
Miembro
 
Registrado: jun 2010
Posts: 39
Poder: 0
isnagil Va por buen camino
Ahora es:

HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Client: THTTPClient);
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
Pues por lo que veo (he instalado la versión Community Edition) en la versión 10.4 han hecho ese cambio.

Por ahora te puedo decir que todas las funciones del API para gestionar los certificados que estaban en CertHelper y las que te declaré en el ejemplo las vas a encontrar en System.Net.HttpClient.Win

No he podido averiguar que hacer con el THTTPClient que si tiene para elegir el certificado de la lista de los instalados en el sistema pero ni idea como pasarle un certificado de un fichero.
En un foro en inglés hablan de modificar un evento (DoClientCertificateAccepted) para que haga lo que te interesa.

Si averiguo algo más actualizo información. A mi en parte me interesa por si algún día me obligan a actualizar versión de Delphi.
Responder Con Cita
  #7  
Antiguo 29-09-2023
isnagil isnagil is offline
Miembro
 
Registrado: jun 2010
Posts: 39
Poder: 0
isnagil Va por buen camino
Ok, gracias.

Lo ideal sería cargar directamente el certificado del fichero pfx pero una solución menor sería seleccionar directamente el certificado instalado en almacén de windows sin que aparezca la ventana que le pregunta al cliente.

Voy a buscar información al respecto, aunque por lo que dices sabes como hacerlo.

Gracias por tu interés
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 07:45:14.


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