Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eduardoaw/9aa56e8b4e51cee3357f2d48c43542b9 to your computer and use it in GitHub Desktop.
Save eduardoaw/9aa56e8b4e51cee3357f2d48c43542b9 to your computer and use it in GitHub Desktop.
Tutorial de instalação do Lets Encrypt no Glassfish 4.x

Tutorial de instalação do Lets Encrypt no Glassfish 4.x

Gerando certificado Lets Encrypt

Para gerar o certificado Lets Encrypt é muito simples, aqui as instruções estão baseadas em um tutorial publicado pela Locaweb. (Web archive)

Primeiro vamos criar um diretório para isso:

# cd ~/
# mkdir certificado
# cd certificado

Em seguida fazemos um clone do repositório e rodamos script de instalação.

# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
# ./letsencrypt-auto --help

O próximo passo é ativar o certificado para seu(s) domínio(s), e para isso o Lets Encrypt precisa fazer um acesso de fora para dentro do seu servidor e verificar se o domínio realmente aponta para a máquina onde você está tentando gerar. Como estamos tratando do Glassfish isso pode ser feito de duas formas.

  1. O primeiro é o modo Standalone que irá subir um serviço na porta 443, para isso basta parar o seu Glassfish e depois executar o comando:
# ./letsencrypt-auto certonly --standalone -d seusite.com.br -d www.seusite.com.br
  1. Para os casos em que você não pode parar o Glassfish, ou por algum motivo não pode subir um serviço na porta 443, você pode usar o modo Webroot. Neste modo ele irá gerar alguns arquivos de validação dentro do servidor e em seguida tentará acessar esses arquivos externamente. Para isso você deve apontar para o diretório web raiz da sua aplicação padrão que está rodando no Glassfish, por exemplo: /usr/local/glassfish4/glassfish/domains/domain1/applications/SuaAplicacao/. E então o comando fica assim:
# ./letsencrypt-auto certonly -d seusite.com.br -d www.seusite.com.br -w /usr/local/glassfish4/glassfish/domains/domain1/applications/SuaAplicacao/

Obs¹: Importante ressaltar que para utilizar a opção 2 você já deve ter alterado a porta HTTPS de 8181 para 443 no Glassfish.

Em ambos o Lets Encrypt irá pedir em seguida um e-mail para caso necessite de recuperação do certificado e então irá validar o seu domínio. Se tudo der certo, no final do processo seu certificado estará gerado em /etc/letsencrypt/live/seusite.com.br/.

Convertendo os certificados para JKS

Se você já olhou no diretório onde os certificados foram gerados, notou que os arquivos estão com extensão .pem, porém o Glassfish precisa de certificados no formato .jks. Para isso precisamos executar um script de conversão. Felizmente eu encontrei um pronto no forum do Lets Encrypt, fiz apenas algumas modificações:

#!/bin/sh

# Definindo as variáveis

#Alias do certificado, pode ser preenchido à gosto
NAME=seualias
#Domínio registrado no Lets Encrypt (ex. seusite.com.br)
DOMAIN=seusite.com.br
#Senha do keystore, se você não alterou na criação do seu domain do Glassfish, então ela é "changeit"
KEYSTOREPW=changeit

LIVE=/etc/letsencrypt/live/$DOMAIN

# Criando diretório para conversão dos certificados

mkdir temp_cert
cd temp_cert

# Criando o keystore.jks

openssl pkcs12 -export -in $LIVE/cert.pem -inkey $LIVE/privkey.pem -out cert_and_key.p12 -name $NAME -CAfile $LIVE/chain.pem -caname root -password pass:$KEYSTOREPW

keytool -importkeystore -destkeystore keystore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -alias $NAME -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW
keytool -import -noprompt -trustcacerts -alias root -file $LIVE/chain.pem -keystore keystore.jks -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

openssl pkcs12 -export -in $LIVE/fullchain.pem -inkey $LIVE/privkey.pem -out pkcs.p12 -name glassfish-instance -password pass:$KEYSTOREPW
keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 -srcstoretype PKCS12 -alias glassfish-instance -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

openssl pkcs12 -export -in $LIVE/fullchain.pem -inkey $LIVE/privkey.pem -out pkcs.p12 -name s1as -password pass:$KEYSTOREPW
keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 -srcstoretype PKCS12 -alias s1as -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

# Criando o cacerts.jks

openssl pkcs12 -export -in $LIVE/cert.pem -inkey $LIVE/privkey.pem -out cert_and_key.p12 -name $NAME -CAfile $LIVE/chain.pem -caname root -password pass:$KEYSTOREPW

keytool -importkeystore -destkeystore cacerts.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -alias $NAME -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW
keytool -import -noprompt -trustcacerts -alias root -file $LIVE/chain.pem -keystore cacerts.jks -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

openssl pkcs12 -export -in $LIVE/fullchain.pem -inkey $LIVE/privkey.pem -out pkcs.p12 -name glassfish-instance -password pass:$KEYSTOREPW
keytool -importkeystore -destkeystore cacerts.jks -srckeystore pkcs.p12 -srcstoretype PKCS12 -alias glassfish-instance -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

openssl pkcs12 -export -in $LIVE/fullchain.pem -inkey $LIVE/privkey.pem -out pkcs.p12 -name s1as -password pass:$KEYSTOREPW
keytool -importkeystore -destkeystore cacerts.jks -srckeystore pkcs.p12 -srcstoretype PKCS12 -alias s1as -srcstorepass $KEYSTOREPW -deststorepass $KEYSTOREPW -destkeypass $KEYSTOREPW

# Listando as chaves

keytool -list -keystore keystore.jks -storepass $KEYSTOREPW
keytool -list -keystore cacerts.jks -storepass $KEYSTOREPW

# Fim

cd ..

Perceba que existem 3 variáveis que você deve alterar os valores no início deste script, são elas NAME, DOMAIN e KEYSTOREPW.

Atenção especial para a KEYSTOREPW, pois se você não definiu uma nova senha quando criou seu domain no Glassfish ou se você está utilizando o domain1 que já vem criado, essa senha deve ser changeit. (Se você informar a senha errada o Glassfish irá acusar um erro na inicilização e o servidor não irá subir).

Ao término da execução do script você terá os arquivos cacerts.jks e keystore.jks criados dentro do diretório temp_cert onde você acabou de rodar o script. Estes dois arquivos precisam ser copiados para dentro da pasta config do seu domain dentro do Glassfish (ex. /usr/local/glassfish4/glassfish/domains/domain1/config/). Para evitar transtornos, faça um cópia de BKP dos arquivos cacerts.jks e keystore.jks que já vem por padrão na pasta config.

Em seguida basta reiniciar o Glassfish e o certificado já estará funcionando. (O comando para reiniciar o Glassfish pode variar de acordo com seu ambiente, mas isso provavelmente você já sabe 😃)

Revalidando sua senha do Web Admin Console

Após o certificado instalado com sucesso você não conseguirá acessar o Web Admin Console do Glassfish, se tentar receberá uma mensagem informando que a sua senha está inválida (mesmo não estando). Para corrigir encontrei uma solução no stackoverflow onde basicamente você desativa e ativa o Web Admin Console.

# /usr/local/glassfish4/bin/asadmin disable-secure-admin
# /usr/local/glassfish4/bin/asadmin restart-domain domain1
# /usr/local/glassfish4/bin/asadmin enable-secure-admin
# /usr/local/glassfish4/bin/asadmin restart-domain domain1

Atenção para informar o caminho correto do asadmin e o nome correto do seu domain

Considerações finais

O Let's Encrypt veio para acabar com as desculpas por não se utilizar HTTPS em serviços Web, e apesar de não ser uma tarefa fácil, vimos que é possível efetuar a instalação também GlassFish 4.x.

A única ressalva, é que os certificados do Let's Encrypt tem uma curta duranção de validade, o que te obriga a fazer a renovação e re-executar todos esses passos no máximo em 90 dias.

Pretendo criar uma forma de automatizar esse script em breve para que seja possível agendar, por exemplo, uma tarefa CRON no linux e facilitar o processo de renovação.

Dúvidas e sugestões, fiquem livres para comentar ou enviar um PullRequest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment