Página 1 de 1

Testar Validade de um certificado

Enviado: 19 Mar 2025 11:15
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

Testar Validade de um certificado

Enviado: 19 Mar 2025 16:01
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

Testar Validade de um certificado

Enviado: 19 Mar 2025 16:06
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.