Pular para conteúdo

Exemplo Eclipse

Integração com Eclipse

O Eclipse é uma IDE para Linux e Windows usada para desenvolver código java.

A versão utilizada na integração foi 4.20.0. A versões acima da 8 em diante podem ser utilizadas para esse guia, sendo que a versão 8 ou anteriores tem algumas diferenças devido a uma mudança no Java a partir da versão 9.

Configuração do Ambiente

  1. Instalar o cliente do HSM no seu ambiente.

  2. Instalação Windows

  3. Instalação Linux

  4. Configurar as variáveis de ambiente básicas. Isso pode ser feito editando as variáveis diretamente ou pelo DINAMOcon.

  5. DFENCE_PKCS11_IP: IP do HSM

  6. DFENCE_PKCS11_USER: Nome do usuário do HSM

Caso queira utilizar múltiplos usuários na aplicação o ideal é habilitar a variável:

Para informações adicionais consulte a seção de configuração.

As aplicações Java que fazem uso de PKCS#11 precisam utilizar algumas bibliotecas do HSM; todas estão na pasta de instalação. O nome do arquivo é tacndp11.dll (Windows) ou libtacndp11.so (Linux).

Exemplos:

  • Instalação 64-bis:

    • Versão 64-bits: C:\Program Files\Dinamo Networks\HSM Dinamo\sdk\c\tacndp11.dll
    • Versão 32-bits: C:\Program Files\Dinamo Networks\HSM Dinamo\sdk\32-bit\tacndp11.dll
  • Instalação 32-bits:

    • C:\Program Files\Dinamo Networks\HSM Dinamo\sdk\c\tacndp11.dll

No Linux a biblioteca PKCS#11 estará na pasta de bibliotecas do sistema.

Exemplos:

  • CentOS/Red Hat 64-bits:

    • /usr/lib64/libtacndp11.so
  • Ubuntu/Debian 32-bits/64-bits e CentOS/Red Hat 32-bits:

    • /usr/lib/libtacndp11.so

Configurando Projeto

Para configurar o projeto é necessário adicionar a biblioteca tacndjavalib.jar ao build path. A biblioteca ndjac.jar só precisa ser adicionada caso esteja utilizando a JCA.

Tela de configuração do _build path_ no Eclipse

Tela de configuração do _build path_ no Eclipse

Código Exemplo (Java 9+)

A diferença do java 9+ e do java 8 é somente como as bibliotecas são importadas e como o objeto do provider é criado.

O código a seguir cria o provider com a biblioteca da Dinamo, carrega a keystore do usuário master usando a o método special password com a variável de ambiente DFENCE_PKCS11_SPECIAL_PWD habilitada, e em seguida lista o nome e conteúdo dos certificados na partição do usuário.

O resultado do exemplo é mais interessante se houver certificados na partição.

O arquivo p11config.cfg precisa ter no mínimo os campos name e library. Abaixo exemplos:

name = dinamo
library = C:\Program Files\Dinamo Networks\HSM Dinamo\sdk\c\tacndp11.dll

name = dinamo
library = /usr/lib/libtacndp11.so
ou

name = dinamo
library = /usr/lib64/libtacndp11.so

Nota

A Documentação de PKCS#11 da Oracle pode ser encontrada aqui.

import java.io.IOException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.security.cert.CertificateException;
import java.util.Enumeration;

public class pkcs11 {
    public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
        String pkcs11Config = "/usr/app/p11config.cfg";
        Provider p = Security.getProvider("SunPKCS11");
        p = p.configure(pkcs11Config);
        java.security.Security.addProvider(p);

        /////
        //
        // Nota: substitua a string de pin usando o formato:
        //
        // usuario:senha@ip
        //
        /////

        String pin = "master:12345678@192.168.1.101";
        java.security.KeyStore keyStore = java.security.KeyStore.getInstance("PKCS11");
        keyStore.load(null, pin.toCharArray());

        Enumeration<String> enumeration = keyStore.aliases();
        while(enumeration.hasMoreElements()) {
            String alias = enumeration.nextElement();
            System.out.println("alias name: " + alias);
            java.security.cert.Certificate certificate = keyStore.getCertificate(alias);
            System.out.println(certificate.toString());
            }
    }
}

Para configurar o provider no java 8 o código é o seguinte:

Provider providerPKCS11 = new sun.security.pkcs11.SunPKCS11(pkcs11Config);
java.security.Security.addProvider(providerPKCS11);