Testar Validade de um certificado

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Testar Validade de um certificado

Mensagem por malcarli »

Bom dia, Devs, estou fazendo um teste para avisar os clientes da proximidade de vencimento ou mesmo se o certificado está vencido usando a função que está no prg ze_sefaz_capicom. Fiz o teste abaixo, mas no caso do certificado estar vencido dá erro de método não exportado para ValidToDate. Teria como contornar este erro? Obg

Código: Selecionar todos

               If Dtos(CapicomCertificado(cCert):ValidToDate) < Dtos(Date())  /// SE CERTIFICADO VENCIDO, DÁ ERRO DE MÉTODO NÃO EXPORTADO PARA VALIDTODATE
                  MsgExclamation([Certificado Digital Vencido em ] + Dtoc(CapicomCertificado(cCert):ValidToDate) + [, Verifique !!])
                 _SetFocus([p_TIPO], [form_GNFEXML])
                  Return (Nil)
               Endif

               If CapicomCertificado(cCert):ValidToDate - Date() < 31
                  MsgExclamation([Certificado Digital Irá Vencer em Breve: ] + Dtoc(CapicomCertificado(cCert):ValidToDate) + hb_OsNewLine() + [Providencie a Renovação !!!])
                 _SetFocus([p_TIPO], [form_GNFEXML])
                  Return (Nil)
               Endif

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Testar Validade de um certificado

Mensagem por JoséQuintas »

Alterei na sefafzclass pra ela pegar o certificado válido, apesar de não adiantar muita coisa.
No caso de certificado vencido, o retorno é vazio.

Código: Selecionar todos

oCert := CapicomCertificado( cCert )
DO CASE
CASE Empty( oCert )
   ? "Não tem certificado válido"
CASE oCert:ValidToDate < Date()
   ? "Certificado vencido"
OTHERWISE
   ? "Certificado Ok"
ENDCASE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Testar Validade de um certificado

Mensagem por JoséQuintas »

Só lembrando:

Código: Selecionar todos

FUNCTION CapicomEscolheCertificado( dValidFrom, dValidTo )

   LOCAL oCertificado, oStore, cNomeCertificado := "NENHUM", oColecao

   oStore := win_oleCreateObject( "CAPICOM.Store" )
   oStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
   oColecao := oStore:Certificates()
   DO CASE
   CASE oColecao:Count() == 1
      oCertificado     := oColecao:item(1)
      dValidFrom       := oCertificado:ValidFromDate
      dValidTo         := oCertificado:ValidToDate
      cNomeCertificado := oCertificado:SubjectName
   CASE oColecao:Count() > 1
      oCertificado     := oColecao:Select( "Selecione o certificado para uso da Nfe","Selecione o certificado", .F. )
      dValidFrom       := oCertificado:item(1):ValidFromDate
      dValidTo         := oCertificado:item(1):ValidToDate
      cNomeCertificado := oCertificado:item(1):SubjectName
   ENDCASE
   IF "CN=" $ cNomeCertificado
      cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
      IF "," $ cNomeCertificado
         cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
      ENDIF
   ENDIF
   // oStore:Close()

   RETURN cNomeCertificado

FUNCTION CapicomCertificado( cNomeCertificado, dValidFrom, dValidTo, lValidDate )

   LOCAL oStore, oColecao, oCertificado, nCont, lValid

   hb_Default( @lValidDate, .T. )
   oStore := Win_OleCreateObject( "CAPICOM.Store" )
   oStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
   oColecao := oStore:Certificates()
   //aList := oColecao:Find( CAPICOM_CERTIFICATE_FIND_ISSUER_NAME, cNomeCertificado, .T. )
   FOR nCont = 1 TO oColecao:Count()
      IF cNomeCertificado $ oColecao:Item( nCont ):SubjectName
         lValid := oColecao:Item( nCont ):ValidFromDate <= Date() .AND. oColecao:Item( nCont ):ValidToDate >= Date()
         IF ! ( lValid == lValidDate )
            LOOP
         ENDIF
         oCertificado := oColecao:Item( nCont )
         dValidFrom   := oCertificado:ValidFromDate
         dValidTo     := oCertificado:ValidToDate
         EXIT
      ENDIF
   NEXT
   oStore:Close()
   //IF aList:Count() > 0
   //   oCertificado := aList:Item(0)
   //   dValidFrom   := oCertificado:ValidFromDate
   //   dValidTo     := oCertificado:ValidToDate
   //ENDIF

   RETURN oCertificado

FUNCTION CapicomRemoveCertificado( cNomeCertificado, lValidDate )

   LOCAL oCertificado, oStore

   hb_Default( @lValidDate, .F. )

   oCertificado := CapicomCertificado( cNomeCertificado,, lValidDate )
   IF ValType( oCertificado ) == "O"
      oStore := win_OleCreateObject( "CAPICOM.Store" )
      oStore:open( CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_WRITE )
      oStore:Remove( oCertificado )
      oStore:Close()
   ENDIF

   RETURN NIL
Pensei em remover automático os vencidos, mas se fizer isso na máquina que vai comprrar certificado, aí ferra de vez.
Podem ser vários certificados instalados também.
Tem que pensar com cuidado nisso de apagar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder