Assinando digitalmente aplicativo JAVA com CA Windows

O Objetivo deste post é demonstrar como realizar a assinatura de um aplicativo JAVA utilizando uma Autoridade Certificadora (CA) Windows.

Motivação

Em um ambiente corporativo com infraestrutura de domínio e Active Directory já existe uma autoridade certificadora e todos os membros do domínio já confiam nos certificados assinados por esta CA. Desta forma facilita o trabalho de publicação do aplicativo e confiança da assinatura digital deste.

Pré-requisito

Este post tem como pré-requisito o Windows 2003 Enterprise Edition ou DataCenter Edition. E Acredite não adianta tentar no Standard Edition que não funciona.

Passos de uma assinatura de aplicativo:

Para realizar a assinatura digital de um aplicativo alguns passos são necessários:

  1. Gerar requisição do certificado;
  2. Assinar o certificado através da CA;
  3. Gerar o arquivo no padrão PKCS#12;
  4. Assinar o aplicativo;
  5. Verificação da assinatura do aplicativo.

1.  Gerando requisição do certificado

Para a geração da requisição do certificado será utilizado o OpenSSL (download do OpenSSL no final do post) por se tratar de um aplicativo OpenSource, de fácil utilização, e com uma completa documentação.

1.1. Configurando OpenSSL

Para a realização deste procedimento é necessário criar um diretório onde serão salvos diversos arquivos. Neste post o diretório criado foi C:\CodSign

Crie um arquivo nomeado openssl.conf neste diretório com o seguinte conteúdo:

# Início do arquivo openssl.conf
#
# Criado por Helvio Junior
# helvio_junior@hotmail.com

RANDFILE        = openssl/.rnd

####################################################################
[ ca ]
default_ca    = CA_default        # The default ca section

####################################################################
[ CA_default ]

certs        = openssl/certs            # Where the issued certs are kept
crl_dir        = openssl/crl            # Where the issued crl are kept
database    = openssl/database.txt        # database index file.
new_certs_dir    = openssl/certs            # default place for new certs.

certificate    = cacert.pem            # The CA certificate
serial        = openssl/serial.txt         # The current serial number
crl        = crl.pem         # The current CRL
private_key    = private/cakey.pem       # The private key
RANDFILE    = private/private.rnd     # private random number file

x509_extensions    = x509v3_extensions    # The extentions to add to the cert
default_days    = 365            # how long to certify for
default_crl_days= 30            # how long before next CRL
default_md    = md5            # which md to use.
preserve    = no            # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that 🙂
policy        = policy_match

# For the CA policy
[ policy_match ]
commonName        = supplied
emailAddress        = optional
countryName        = optional
stateOrProvinceName    = optional
organizationName    = optional
organizationalUnitName    = optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
commonName        = supplied
emailAddress        = optional
countryName        = optional
stateOrProvinceName    = optional
localityName        = optional
organizationName    = optional
organizationalUnitName    = optional

####################################################################
[ req ]
default_bits        = 1024
default_keyfile     = privkey.pem
distinguished_name    = req_distinguished_name
attributes        = req_attributes

[ req_distinguished_name ]
commonName            = Common Name (eg, your application name)
commonName_max            = 64
emailAddress            = Email Address
emailAddress_max        = 40
countryName            = Country Name (2 letter code)
countryName_min            = 2
countryName_max            = 2
countryName_default        = BR
stateOrProvinceName        = State or Province Name (full name)
localityName            = Locality Name (eg, city)
0.organizationName        = Organization Name (eg, company)
organizationalUnitName        = Organizational Unit Name (eg, section)

[ req_attributes ]
challengePassword        = A challenge password
challengePassword_min        = 4
challengePassword_max        = 20

[ v3_code_sign ]
#Code Sign Object Identifier
certificatePolicies=1.3.6.1.5.5.7.3.3

#
# Final do arquivo openssl.conf

1.2. Gerando a chave privada do certificado

openssl genrsa -des3 -out .\app.key 2048

Ao executar este comando uma senha será solicitada, esta senha é de proteção da chave privada.


1.3. Gerando a requisição

openssl req -reqexts v3_code_sign -new -sha1 -key .\app.key -out .\app.csr -config .\openssl.conf

Ao executar este comando a senha da chave privada é solicitada.

Após a senha da chave são solicitados as informações do certificado.

1.4. Visualizando os arquivos e a requisição

Pode-se visualizar no diretório que 2 arquivos foram criados (app.key e app.csr), onde app.key é a chave privada que do certificado da aplicação e app.csr é a requisição de certificado.

Abrindo o arquivo app.csr no Bloco de Notas se pode ver a requisição em formato Base64.

2. Assinar o certificado através da CA

Para realizar a assinatura do certificado é necessário realizar algumas configurações prévias na CA. Este post considera que a CA está instalada e operacional no Windows 2003 Enterpreise Edition ou no Windows 2003 Data Center Edition.

2.1. Criando template na CA

Abra o gerenciador da Autoridade Certificadora

Clique no nome da sua CA, expanda a arvore, vá em Certificate Templates, Clique com o botão direito e clique em Manage.

Neste momento será aberto o gerenciador de templates. Selecione o Template Code Signing e clique em Duplicate Template.

Na Aba General digite o nome do template, em nosso exemplo digitei Code Sigining Test.

Vá até a aba Subject Name e altere a opção para Supply in the request para permitir que os dados da geração do certificado seja os dados informados no momento da geração da requisição.

E por último verifique a permissão de utilização deste template. Estas permissões definem os usuários que podem, entre outras coisas, assinar e ler  um certificado utilizando este template.

Clique em OK para finalizar a criação do template e feche o gerenciador de templates.

Até este ponto foi criado o template porém não foi disponibilizado na console WEB para utilização, desta forma os próximos passos objetiva realizar esta liberação.

Clique em Certificate Template com o botão direito e clique em new e Certificate Template to Issue.

Selecione o template criado nos passos anteriores e clique em OK.

Pronto. Toda a configuração necessária na CA está concluída. Agora vamos aos passos de assinatura do certificado.

2.2. Assinando o certificado

Acesse a console web da CA.

Clique no link Request a Certificate.

Clique no link advanced certificate request.

Clique no link Submit a certificate request by using

Selecione o template criado nos passos anteriores, copie o conteúdo do arquivo app.csr (criado no passo 1), cole no campo Saved Request e clique em Submit.

Se a assinatura for bem sucedida a tela abaixo deve ser exibida, selecione a opção de Base 64 encoded e clique em Download certificate e salve o certificado no mesmo local da requisição com o nome de app.cer.

Nas imagens abaixo podemos ver as propriedades do certificado assinado.

Por último, volte a tela inicial da console web da CA e realize o download do certificado da CA clicando em Download a CA certificate.

Selecione o certificado atual da CA, depois o Encoding Base 64 e clique em Download CA Certificate. 

Salve o arquivo no mesmo local da requisição com o nome de ca.cer.

3. Geração do arquivo PKCS#12

Para a geração do PKCS#12 será utilizado o OpenSSL e é necessário a chave privada (app.key) + o certificado assinado (app.cer) + o certificado da CA (ca.cer).

Execute o comando abaixo

openssl pkcs12 -export -chain -name "APPSign001" -out .\app.pfx -in .\app.cer -inkey .\app.key -CAfile .\ca.cer

Ao executar este commando duas senhas serão solicitadas, a primeira é para abrir a chave privada, já a segunda (e sua confirmação) é a senha de exportação do PKCS#12. A senha da exportação pode ser diferente da senha da chave privada.

Neste comando há um item de importante que deve variar conforme  o seu ambiente –name “AppSign001” este define um apelido para o seu certificado, e este apelido que será utilizado na assinatura do JAVA, desta forma não pode ser suprimido. Este apelido pode ser alterado para o nome que desejar.

Neste ponto nosso diretório deve conter os seguintes arquivos

4. Assinado o aplicativo JAVA com o certificado gerado.

Para a assinatura é necessário a instalação do JAVA JDK e configuração para que no Path do sistema operacional tenha o caminho %programfiles%\java\jdk1.6.0_21\bin. Vale a pena observar que o caminho pode se alterar conforme a versão do JDK que está instalado.

O Aplicativo que iremos assinar é um teste simples que mostra em tela um Hello World conforme demonstrado na imagem abaixo. O Aplicativo está disponível para download no final do post.

Copie o teste.jar para o diretório onde está o certificado digital.

Agora vamos verificar as classes do aplicativo bem como se há algum certificado assinando este aplicativo. Execute o comando abaixo:

jarsigner -verify -verbose -certs Teste.jar

Podemos observar que este aplicativo ainda não foi assinado. Para assinar este aplicativo execute o comando abaixo. Ao executar-lo a senha do PKCS#12 é solicitada.

jarsigner -storetype pkcs12 -keystore app.pfx Teste.jar APPSign001

Agora iremos novamente realizar a verificação da assinatura do aplicativo com o comando

jarsigner -verify -verbose -certs Teste.jar

Pronto o aplicativo está assinado digitalmente.

Arquivos para download

OpenSSL

OpenSSL.conf e teste.jar

Helvio Junior

Helvio Junior

Especialista em Segurança Ofensiva e Análise de Malwares em SafeTrend
Especialista em Segurança Ofensiva e pesquisador independente de Malwares.
Helvio Junior
0 respostas

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *