Requisitar chave do certificado

Olá a todos.

Preciso selecionar um certificado digital instalado no Windows e gravar essa chave em uma tabela do banco de dados.

certificado.png


Já pesquisei bastante e não consegui encontrar como faço isso no B4J. Ou, encontrei e não entendi. :D

Alguém pode dar uma ajuda nessa questão?
 

Claudio Oliveira

Active Member
Licensed User
Longtime User
Raphael,
Use o WindowsPowerShell
Você precisa referenciar a library jSHell

B4X:
Sub GravaArqCertificados(CaminhoArquivo as String, NomeArquivo as String)
    Dim SH as Shell
    sh.Initialize("SH", "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe",  Array As String($"get-childitem -Recurs -path cert:\CurrentUser\My | format-list -property * > ${NomeArquivo}"$))
    sh.WorkingDirectory = CaminhoArquivo
    sh.Run(10000)
    StartMessageLoop
End Sub
.
.
.
Sub SH_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
   If Success And ExitCode = 0 Then
     Log("Success")
     Log(StdOut)
   Else
     Log("Error: " & StdErr)
   End If
End Sub

Exemplo de Utilização:
B4X:
    GravaArqCertificados(File.DirApp, "certificados.txt")

Se tudo der certo (aqui no meu teste funcionou TOTAL!), no diretório especificado haverá um arquivo texto de nome especificado contendo todas as informações dos certificados em "Usuário Atual\Pessoal\Certificados", EXCETO a chave pública e muito menos a chave privativa.
A partir daí, é ler o arquivo e interpretar os dados nele contidos. Você vai perder uns 10 minutos estudando esses dados.
Talvez seja preciso acertar o caminho do PowerShell na sua máquina, mas isso é galho fraco.

O código acima com toda certeza pode e DEVE ser melhorado e enriquecido. Foi escrito às pressas e sem muito cuidado, apenas pra demonstrar o processo.

A alternativa é criar uma DLL em "C" pra acessar a CryptoAPI do Windows, e um programa em Java usando JNI pra acessar essa DLL em "C", uma vez que Java não tem como acessar nativamente componentes COM e ActiveX do Windows, ou seja: esquece isso! :D

Espero ter ajudado.

Boa sorte! ;)
 
Raphael,
Use o WindowsPowerShell
Você precisa referenciar a library jSHell

B4X:
Sub GravaArqCertificados(CaminhoArquivo as String, NomeArquivo as String)
    Dim SH as Shell
    sh.Initialize("SH", "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe",  Array As String($"get-childitem -Recurs -path cert:\CurrentUser\My | format-list -property * > ${NomeArquivo}"$))
    sh.WorkingDirectory = CaminhoArquivo
    sh.Run(10000)
    StartMessageLoop
End Sub
.
.
.
Sub SH_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
   If Success And ExitCode = 0 Then
     Log("Success")
     Log(StdOut)
   Else
     Log("Error: " & StdErr)
   End If
End Sub

Exemplo de Utilização:
B4X:
    GravaArqCertificados(File.DirApp, "certificados.txt")

Se tudo der certo (aqui no meu teste funcionou TOTAL!), no diretório especificado haverá um arquivo texto de nome especificado contendo todas as informações dos certificados em "Usuário Atual\Pessoal\Certificados", EXCETO a chave pública e muito menos a chave privativa.
A partir daí, é ler o arquivo e interpretar os dados nele contidos. Você vai perder uns 10 minutos estudando esses dados.
Talvez seja preciso acertar o caminho do PowerShell na sua máquina, mas isso é galho fraco.

O código acima com toda certeza pode e DEVE ser melhorado e enriquecido. Foi escrito às pressas e sem muito cuidado, apenas pra demonstrar o processo.

A alternativa é criar uma DLL em "C" pra acessar a CryptoAPI do Windows, e um programa em Java usando JNI pra acessar essa DLL em "C", uma vez que Java não tem como acessar nativamente componentes COM e ActiveX do Windows, ou seja: esquece isso! :D

Espero ter ajudado.

Boa sorte! ;)


Cláudio, muito obrigado.
Testei aqui e funcionou exatamente como você disse. :)

Inicialmente eu ia usar JNI e C++ mas o pessoal aqui da empresa tem um certo preconceito com elas. :D
 

Claudio Oliveira

Active Member
Licensed User
Longtime User
Testei aqui e funcionou exatamente como você disse. :)

Inicialmente eu ia usar JNI e C++ mas o pessoal aqui da empresa tem um certo preconceito com elas. :D

Hehehehehe
Confesso que eu também tenho esse certo preconceito aí... Principalmente porque eu nunca fui "fera" em C, e sempre achei que deveria ser utilizada apenas naquelas aplicações que nenhuma outra linguagem poderia resolver, geralmente aplicações relacionadas a acessos de baixíssimo nível ao S.O. ou ao próprio hardware. Ou então em aplicações onde o desempenho e a temporização são extremamente críticos, como sistemas de monitoramento e aquisição de dados de sensores, tipo os de temperatura de caldeiras, por exemplo.

Bom, de qualquer forma,que bom que essa solução funcionou aí também! :)

Abraço!
 
Top