Exemplo Java/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. Configurar as variáveis de ambiente básicas. Isso pode ser feito editando as variáveis diretamente ou pelo DINAMOcon.

    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

Configurando projeto no Eclipse

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.

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

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);

Last updated