Criptografia em AdvPL – Parte 16

Introdução

No post anterior (Criptografia em AdvPL – Parte 15) vimos assinatura digital S/MIME e a função SMimeSign(). Agora, vamos entrar na no universo das funções criptográficas usando um HSM — Hardware Security Module — e o que podemos fazer com isso no AdvPL 😀 Para ver o índice de tudo o que já foi publicado nessa série de posts, acesse o link Criptografia e Segurança.

HSM

Agora que já vimos bastante coisa sobre criptografia, chaves e certificados, o ponto comum dos exemplos e funções abordadas é : Os certificados e chaves até o momento foram salvas em arquivos em disco, e usamos funções criptográficas de alguma aplicação — seja o OpenSSL ou o TOTS Application Server — para carregar e usar estes arquivos.

Quando utilizamos um equipamento do tipo HSM, ao invés de eu carregar o certificado e usá-lo na minha aplicação, eu uso um Driver ou API do dispositivo, para cadastrar nele as chaves e certificados que eu vou utilizar — e quero manter protegidos — e então eu uso uma API Cliente do Driver ou Dispositivo para consumir os certificados e chaves. O TOTVS Application Server permite configurar um driver de dispositivo HSM e disponibiliza funções específicas no AdvPL para utilizá-lo. Vamos ver neste post o que é isso e como funciona 😀

API Client do HSM / Cryptoki

O padrão PKCS#11 define uma especificação de APIs para consumir os serviços de um HSM. Normalmente o fornecedor do hardware HSM disponibiliza uma API ou library (dll/so) Client do dispositivo neste padrão, possibilitando a implementação final — uma mesma implementação de criptografia pode ser feita para vários modelos de HSM. Esta API é conhecida com “Cryptoki Library”, e possui as funções padronizadas na especificação PKCS11 para serem consumidas por uma aplicação final.

Para fazer os testes e programas de exemplo, eu não necessariamente preciso de um Hardware HSM, eu posso usar um emulador do hardware e a Cryptoki fornecida pelo fabricante, ou mesmo usar uma implementação Open-Source que emule um HSM. Após algumas pesquisas, optei por usar um pacote “pronto” para Windows — SoftHSM2 — baseado no projeto OpenDNSSEC.

SoftHSM2

Disponível em diversas plataformas, os links de download estão disponíveis em https://www.opendnssec.org/download/packages/ . A build Windows que será utilizada pode ser baixada no link https://github.com/disig/SoftHSM2-for-Windows/ . Optei por pegar a versão completa já com instalador, que configura algumas variáveis de ambiente necessárias para a API, instalação default no path sugerido “c:\SoftHSM2′.

Teste inicial com o TOTVS Application Server

Instalado o SoftHSM2 com as configurações default, a DLL com a implementação da API com as funções PKCS#11 deve estar na pasta “C:\SoftHSM2\lib”. Para usar com um TOTVS Application Server de 32 bits, usamos o arquivo “softhsm2.dll“, e para uso com Application Server 64 bits, usamos o arquivo “softhsm2-x64.dll“. No meu ambiente, eu uso o P12 Lobo Guará x64. Logo, vamos configurar a seção SSLConfigure com os seguintes parâmetros:

[sslconfigure]
HSM=1
Module=C:\SoftHSM2\lib\softhsm2-x64.dll
verbose=1

Ao subir o TOTVS Application Server, aparecem algumas informações novas no log e console:

[INFO ][SSL] Configuring to use HSM
[INFO ][SSL] Criptoki Path : supplied (C:\SoftHSM2\lib\softhsm2-x64.dll)
[INFO ][SSL] PIN : supplied
[INFO ][SSL] VERBOSE : ENABLE
[WARN ][SSL] Private Key Client not supplied
[INFO ][SSL] Private Key Client: ENABLE ((null))
[WARN ][SSL] Certificate Client not supplied
[INFO ][SSL] Certificate Client : ENABLE ((null))
[INFO][PKCS11] Found 1 slot
[0] SoftHSM slot ID 0x0 uninitialized, login (no label)
[INFO ][SSL] Status HSM : ENABLE


Por hora este teste apenas garante que utilizamos uma DLL suportada. A documentação da chave “module” da seção sslconfigure  na TDN informa que a DLL informada precisa suportar as funções da PKCS#11 com versão igual ou superior a V 2.10.

Próximos passos

Bem, um dispositivo HSM trabalha com um conceito de SLOTS, onde cada slot pode conter objetos para uso criptográfico, como chaves privadas e certificados. Normalmente o fabricante fornece um SDK com ferramentas de desenvolvimento e de administração do HSM, para que você — de forma assistida — possa gerenciar e armazenar os certificados e chaves de seu uso em um ou mais slots, se for o caso.

No nosso exemplo estamos usando um Software para este armazenamento, emulando um HSM. Logo, precisamos descobrir como usar as ferramentas desse software para armazenar os nossos certificados e chaves.

Ferramenta softhsm2-util

No nosso exemplo de HSM virtual, a ferramenta de linha de comando softhsm2-util vai ser útil para realizar esta tarefa. Inicialmente, vamos ver o que temos registrado no momento, usando o comando abaixo — lembre-se de colocar o caminho “c:\SoftHSM2\bin” no PATH do seu ambiente.

softhsm2-util --show-slots

// resultado obtido
Available slots:
Slot 0
    Slot info:
        Description:      SoftHSM slot ID 0x0
        Manufacturer ID:  SoftHSM project
        Hardware version: 2.5
        Firmware version: 2.5
        Token present:    yes
    Token info:
        Manufacturer ID:  SoftHSM project
        Model:            SoftHSM v2
        Hardware version: 2.5
        Firmware version: 2.5
        Serial number:
        Initialized:      no
        User PIN init.:   no
        Label:

Bem, nos exemplos anteriores criamos um certificado e uma chave privada para HTTPS, chamados respectivamente de “note-juliow-ssd.key” e “note-juliow-ssd.cer”. Vamos começar a brincadeira criando um SLOT no nosso HSM virtual para gravar estas informações:

softhsm2-util --init-token --slot 0 --label "Minhas Chaves" --so-pin 666666 --pin 123456

// Resultado obtido

The token has been initialized and is reassigned to slot 1910125011

No caso, um novo slot foi criado, onde eu informei um PIN de administração ( 666666 ) e um PIN de acesso de usuário ( 123456 ) . Ao executarmos o comando para mostrar os slots, veremos o seguinte:

softhsm2-util --show-slots

Available slots:
Slot 1910125011
    Slot info:
        Description:      SoftHSM slot ID 0x46a35bd7
        Manufacturer ID:  SoftHSM project
        Hardware version: 2.5
        Firmware version: 2.5
        Token present:    yes
    Token info:
        Manufacturer ID:  SoftHSM project
        Model:            SoftHSM v2
        Hardware version: 2.5
        Firmware version: 2.5
        Serial number:    83007bde71da31d3
        Initialized:      yes
        User PIN init.:   yes
        Label:            Minhas Chaves
Slot 1
    Slot info:
        Description:      SoftHSM slot ID 0x1
        Manufacturer ID:  SoftHSM project
        Hardware version: 2.5
        Firmware version: 2.5
        Token present:    yes
    Token info:
        Manufacturer ID:  SoftHSM project
        Model:            SoftHSM v2
        Hardware version: 2.5
        Firmware version: 2.5
        Serial number:
        Initialized:      no
        User PIN init.:   no
        Label:

O novo slot criado recebeu um número de controle, o label ou título “Minhas Chaves”, usando os PIN(s) informados, e ganhou um número de série.

Importando uma Chave Privada para o HSM

Agora, vamos ver como colocar uma chave privada nesse slot. Para isso, na pasta onde está o arquivo “note-juliow-ssd.key”, execute o  comando abaixo:

softhsm2-util --import note-juliow-ssd.key --label "Note-Key" --slot 1910125011 --id a001 --pin 123456 --no-public-key

The key pair has been imported.

No comando acima fornecemos a chave privada a ser importada ( Formato PEM PKCS#8), o slot criado anteriormente, um título para a chave — “Note-Key”, e o PIN de usuário (123456) para permitir a operação, um identificador em hexadecimal que eu criei (a001) e a opção para importar apenas a chave privada (–no-public-key).

Importando um certificado para o HSM

Bem, para eu importar o certificado para esse HSM Virtual, os aplicativos de linha de comando são “limitados”, então eu tive que baixar um “Administrador Genérico” de HSM(s) para Windows — chamado Pkcs11Admin — vide maiores detalhes nos links de referência.

O certificado utilizado foi o anteriormente criado para HTTPS — chamado “note-juliow-ssd.cer”. Ao iniciarmos a ferramenta Pkcs11Admin, devemos informar onde está a DLL do SoftHSM — que é o “dispositivo virtual” utilizado:

pkcs11-1

Lembre-se que o PKCS11Admin usado deve ser compatível em 32 ou 64 bits com a DLL do SoftHSM. Feito isso, vamos no Menu Token -> Login -> User Login, e entramos com o PIN de usuário (123456):

pkcs11-2

Agora podemos posicionar na aba “Keys”, e ver que já temos uma chave importada neste slot:

pkcs11-3

Para importar o certificado, vamos no menu Object -> Import -> Certificate. Será aberta uma caixa de diálogo para localizar o certificado a ser importado no disco. Ao escolher o certificado, a ferramenta mostra os dados do certificado, e até permite editar alguns. Como não é o caso ou objetivo, apenas confirmamos a operação clicando no botão “Create”:

pkcs11-4.png

Feito isso, o certificado já está visível na aba “Certificates”, basta clicar nele com o botão direito e escolher a opção  “View” para conferirmos os detalhes dele:

pkcs11-5

Agora pode fechar o PKCS11Admin, e vamos ver a subida do TOTVS Application Server com o HSM configurado e alimentado:

[INFO][PKCS11] Found 2 slots
[0] SoftHSM slot ID 0x71da31d  login             (Minhas Chaves)
[1] SoftHSM slot ID 0x1        uninitialized, login  (no label)

[INFO ][SSL] Status HSM : ENABLE

Conclusão

Beleza, agora já temos uma “base” para, no próximo post, ver como listar os slots e dados armazenados no HSM, e como recuperá-los para uso no AdvPL 😀  Está curioso ? Então dê uma olhada nas funções HSMSlotList e HSMObjList, elas serão as “primeiras” 😉

A saga HSM continua no próximo Post, e como sempre desejo de coração a todos TERABYTES DE SUCESSO !!! 

Referências

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s