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 21-08-2013
elmacu elmacu is offline
Registrado
NULL
 
Registrado: feb 2011
Posts: 2
Poder: 0
elmacu Va por buen camino
Pkcs7 Sign

Gente, buenos días.-


Es mi primera consulta que hago, aunque hace rato que uso el Club como base de ayuda.

Ante todo, les comento que puse esta consulta como Hilo nuevo, ya que lo que encontré buscando no era lo que necesitaba.

Paso a comentarles.

Estoy renegando hace rato con este tema de la firma digital.

Este caso no tiene que ver con la Factura Electrónica. Cosa que hace tiempo atrás, por suerte, pude resolver.

Paso a comentarles.
1)Tengo que realizar un método Post a una pagina Https.
2)Tengo que enviar un token firmado con un certificado y una clave privada.
3)Este token debe ir firmado en formato PKCS7. / En un principio debía ir encriptado y firmado. Ahora solo debe ir firmado.

He probado haciendo una firma, como lo hice con la factura electrónica (usando Smime de OpenSSL) pero no sirve, ya que del otro lado no han podido verificar y descifrar los datos.
Volví a consultar(a los programadores que mantienen dicha Web, y que por cierto no me dan casi casi nada de info.), y me dijeron que ellos para realizar esta firma lo hacen con la siguiente función de ASP : p7final=PKCS7_Sign(x509,data,0,pkey).

Busque, y he visto que en PHP y ASP , esto se puede implementar si problema ya que existe dicha función, pero en Delphi no logro hacerlo.

Intente usar las Dll de OpenSSL (libeay32.dll y ssleay32.lib), y unas unit que encontre en una Web (libeay32.pas y OpenSSLUtils.pas).
Pero ahi vuelvo a lo mismo, ya que lo que esta realizado obtienen el dato firmado usando SMIME.
Aunque SMIME también firme en formato PKCS7, no me esta sirviendo.

Estas unidades son lo más parecido que encontré a lo que necesito .
Y aunque dentro de dicho código aparece la función, no logro separarla y quedarme con lo que necesito.

Paso a copiarle la funcion que esta en "OpenSSLUtils.pas":

Código Delphi [-]
procedure TMessageSigner.MIMESign;
var
  p7: pPKCS7;
  msgin, msgout: pBIO;
  buff: PAnsiChar;
  buffsize: integer;
begin

// Load private key if filename is defined
if fKey = nil then
  begin
  if fPrivateKeyFile <> '' then
    LoadPrivateKey(fPrivateKeyFile, fPassword)
  else
    raise EOpenSSL.Create('Private key is required.');
  end;

// Load signer certificate
if fCertificate = nil then
  begin
  if fPrivateKeyFile <> '' then
    LoadCertificate(fCertificateFile)
  else
    raise EOpenSSL.Create('Signer certificate is required.');
  end;

msgin := BIO_new_mem_buf( PChar( ansistring(fMessage) ), -1) ;
msgout := BIO_new(BIO_s_mem);
p7 := PKCS7_sign(fCertificate, fKey, fOtherCertificates, msgin, PKCS7_BINARY); //;PKCS7_DETACHED);
BIO_reset(msgin);
SMIME_write_PKCS7(msgout, p7, msgin, PKCS7_TEXT ); //or PKCS7_DETACHED);
// Count used byte
buffsize := BIO_pending(msgout);
GetMem(buff, buffsize+1);
BIO_read(msgout, buff, buffsize);
fSignedMessage := ansistring( StrPas(buff) );
FreeMem(buff);
end;


Por lo que logro entender esta la función que es similar a la que usan, pero no se como implementarla .
Código Delphi [-]
PKCS7_sign(fCertificate, fKey, fOtherCertificates, msgin, PKCS7_BINARY);



Una vez resuelto esto , luego deberé lidiar con la respuesta del POST, donde debo verificar la firma y descifrar el mensaje.

Les pido disculpas sino fui muy claro o realice algo que no corresponde en mi consulta.

Desde ya mil gracias!

Sdos.-
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


La franja horaria es GMT +2. Ahora son las 21:39:01.


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