Ir para conteúdo
  • Cadastre-se

dev botao

Private Key


noelio
  • Este tópico foi criado há 3001 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia,

Em uma rotina para validação de NFe estou me deparando com um incomodo erro em que apresenta a seguinte mensagem:

"Cannot Find Object or Property". E com isto não consigo validar. Informo que o aplicativo esta em fase de teste.

Ao analisar o código observei que é referente ao método "function GetCertificado: ICertificate2;" que encontra-se na unit ACBrNFeConfiguracoes.

Pergunta-se:

- Isto teria a ver com certificação digital ?

ou

- Instalação do certificado digital no PC em que esta rodado o aplicativo ?

Agradeceria a qualquer ajuda que possa ser disponibilizada>

Observação : Sistema desenvolvido em delphi 7 / BD - Firebird 2.0

Link para o comentário
Compartilhar em outros sites

Sim. Segui as instruções para instalação do projeto ACBr.

o erro se apresenta ao executar o seguinte método da ACBrNFeConfiguracoes:


{$IFNDEF ACBrNFeOpenSSL}

function TCertificadosConf.GetCertificado: ICertificate2;

var

  Store        : IStore3;

  Certs        : ICertificates2;

  Cert         : ICertificate2;

  i            : Integer;


  xmldoc  : IXMLDOMDocument3;

  xmldsig : IXMLDigitalSignature;

  dsigKey   : IXMLDSigKey;

  SigKey    : IXMLDSigKeyEx;

  PrivateKey : IPrivateKey;

  hCryptProvider : HCRYPTPROV;

  XML : String;

begin

  if NotaUtil.EstaVazio( FNumeroSerie ) then

    raise EACBrNFeException.Create('Número de Série do Certificado Digital não especificado !');


  Result := nil;

  Store := CoStore.Create;

  Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_STORE_NAME, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);


  Certs := Store.Certificates as ICertificates2;

  for i:= 1 to Certs.Count do

  begin

    Cert := IInterface(Certs.Item[i]) as ICertificate2;

    if Cert.SerialNumber = FNumeroSerie then

    begin

      if NotaUtil.EstaVazio(NumCertCarregado) then

         NumCertCarregado := Cert.SerialNumber;

      if  CertStoreMem = nil then

      begin

        CertStoreMem := CoStore.Create;

        CertStoreMem.Open(CAPICOM_MEMORY_STORE, 'Memoria', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

        CertStoreMem.Add(Cert);

      end;


      PrivateKey := Cert.PrivateKey; [color=#FF0000]{O erro apresenta neste trecho. "A propriedade ou objeto não foi encontrado"}[/color]


      if (FSenhaCert <> '') and PrivateKey.IsHardwareDevice then

       begin

         PrivateKey := Cert.PrivateKey;


         XML := XML + '';

         XML := XML + '';

         XML := XML + '';

         XML := XML + '';


         xmldoc := CoDOMDocument50.Create;

         xmldoc.async              := False;

         xmldoc.validateOnParse    := False;

         xmldoc.preserveWhiteSpace := True;

         xmldoc.loadXML(XML);

         xmldoc.setProperty('SelectionNamespaces', DSIGNS);


         xmldsig := CoMXDigitalSignature50.Create;

         xmldsig.signature := xmldoc.selectSingleNode('.//ds:Signature');

         xmldsig.store := CertStoreMem;


         dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0);

         if (dsigKey = nil) then

            raise EACBrNFeException.Create('Erro ao criar a chave do CSP.');


         SigKey := dsigKey as IXMLDSigKeyEx;

         SigKey.getCSPHandle( hCryptProvider );


         try

           CryptSetProvParam( hCryptProvider , PP_SIGNATURE_PIN, LPBYTE(FSenhaCert), 0 );

         finally

           CryptReleaseContext(hCryptProvider, 0);

         end;


         SigKey    := nil;

         dsigKey   := nil;

         xmldsig   := nil;

         xmldoc    := nil;

      end;


      Result := Cert;

      FDataVenc := Cert.ValidToDate;

      break;

    end;

  end;


  if not(Assigned(Result)) then

    raise EACBrNFeException.Create('Certificado Digital não encontrado!');


end;

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

No meu caso, o problema foi resolvido quando passei a ler o certificado diretamente do smart-card.

Alterei o comando:

 Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_STORE_NAME, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

para:

Store.Open(CAPICOM_SMART_CARD_STORE, CAPICOM_STORE_NAME, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...

Olá pessoal, estou com um problema bem estranho. Estou fazendo tudo certinho, como está neste post, porém quando crio o xmldoc: CoDOMDocumento50.Create vai tudo bem. Quando faço o loadxml também não dá erro. Porém, ele na verdade não lê nada. Já tentei fazer a leitura por arquivo, por memo, por string mesmo e nada. E por este motivo não consigo, obviamente, encontrar a tab signature para fazer a assinatura. Já tentei instalar o delphi numa máquina windows 32 bits para ver se era este o problema e nada. Não sei o que está acontecendo. Alguém já passou por isso? Inclusive já rodei o instala.bat para registrar as dlls do capicom e também msxml5.dll e msxml5r.dll. Se alguém puder me ajudar, ficarei muito grato.

xmldoc := CoDOMDocument50.Create;
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3001 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...