Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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 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.

@wagnermonteverde

This comment has been minimized.

Copy link

commented Oct 27, 2016

Show :)

@LeandroFranciscato

This comment has been minimized.

Copy link

commented Dec 5, 2016

Muito bom. Funcionou perfeitamente aqui!
Obrigado!

@kemelzaidan

This comment has been minimized.

Copy link

commented Jan 10, 2017

Bem bacana! Parabéns! 👍

@habeascorpse

This comment has been minimized.

Copy link

commented May 16, 2017

Muito bom!

@smtrad

This comment has been minimized.

Copy link

commented Sep 14, 2017

Douglas ótimo Tutorial ! parabéns!
Sabe dizer a real necessidade de importar o certificado em duas keystore diferentes (keystore.jks e cacerts.jks) ?

@smtrad

This comment has been minimized.

Copy link

commented Sep 18, 2017

No meu caso, após implantar o certificado está ocorrendo o seguinte erro ao acessar o serviço https:

2017-09-18T10:43:15.877-0300|Advertência: GRIZZLY0050: SSL support could not be configured!
java.io.IOException: A MultiException has 2 exceptions. They are:

  1. java.lang.Error: java.security.UnrecoverableKeyException: Cannot recover key
  2. java.lang.IllegalStateException: Unable to perform operation: post construct on com.sun.enterprise.security.ssl.SSLUtils

Alguém tem alguma do que seja ?

@eduardoaw

This comment has been minimized.

Copy link

commented Sep 26, 2017

Funcionou! Obrigado por contribuir!

@douglasjunior

This comment has been minimized.

Copy link
Owner Author

commented Sep 27, 2017

@smtrad desculpe a demora, o Gist não avisa quando tem comentários por aqui :(

O único problema que eu tive foi em relação à senha do certificado padrão que já vem no Glassfish. Que na maioria dos casos será changeit. Tudo vai depender de como o domínio foi criado.

Em relação ao keystore.jks e cacerts.jks, é um pouco complicado pois você precisa entender os fundamentos do HTTPS, mas aqui tem boas definições.

@eduardoaw

This comment has been minimized.

Copy link

commented Jan 18, 2018

Precisei usar o modo Webroot (Opção 2) nos últimos dias e encontrei alguns ajustes que pode fazer neste tutorial usando este modo.

O comando:
# ./letsencrypt-auto certonly -d seusite.com.br -d www.seusite.com.br -w /usr/local/glassfish4/glassfish/domains/domain1/applications/SuaAplicacao/

deve ser substituído por:
# ./letsencrypt-auto certonly -d seusite.com.br -d www.seusite.com.br -w /usr/local/glassfish4/glassfish/domains/domain1/docroot

Apontei pro docroot pois no processo de validação vi que o letencrypt faz este request http://seusite.com.br/.well-know... e cria .well-know e outros arquivos.

Se fizer um request para http://seusite.com.br vai ver que é ali que ficam aqueles arquivos default do glassfish, como
a 404.html e a index.html com o conteudo "Your server is now running...", por isto usei docroot.

Tendo em vista que o letencrypt faz este request na validação http://seusite.com.br/.well-know... troquei a 8080 do http para 80.

Com estes passos tive exito na instalação do certificado SSL no modo Webroot.

Para habilitar o login na 4848 usei somente o comando ./asadmin --port 4848 enable-secure-admin

@jessejamescin

This comment has been minimized.

Copy link

commented Oct 28, 2018

Não posso fazer isso usando a porta 8181? É que eu tenho uma outra aplicação em PHP no mesmo servidor (usando apache2) e quero deixar o apache2 na porta 443.

@douglasjunior

This comment has been minimized.

Copy link
Owner Author

commented Nov 8, 2018

@jessejamescin se vc já tem um apache na porta 80, então pode usá-lo para gerar o certificado, depois vc só precisa seguir do tópico Convertendo os certificados para JKS em diante.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.