Skip to content

Instantly share code, notes, and snippets.

@douglasjunior
Last active July 19, 2024 16:42
Show Gist options
  • Save douglasjunior/9cb1ff566823a37f07e72aa2c34ab0fb to your computer and use it in GitHub Desktop.
Save douglasjunior/9cb1ff566823a37f07e72aa2c34ab0fb 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 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
Copy link

Show :)

@LeandroFranciscato
Copy link

Muito bom. Funcionou perfeitamente aqui!
Obrigado!

@kemelzaidan
Copy link

Bem bacana! Parabéns! 👍

@habeascorpse
Copy link

Muito bom!

@smtrad
Copy link

smtrad 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
Copy link

smtrad 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
Copy link

Funcionou! Obrigado por contribuir!

@douglasjunior
Copy link
Author

@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
Copy link

eduardoaw 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
Copy link

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
Copy link
Author

@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.

@jorgekruds
Copy link

Se alguém estiver usando no Windows, segue:

certbot certonly --webroot -w "C:\glassfish40\glassfish\domains\Domain1\docroot" -d meusite.com.br

Lembrando que tem que ter o openssl instalado e configurado no Path o caminho para o executável do openssl.exe.

@echo off
REM Definindo as variáveis

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

set LIVE=C:\path\to\letsencrypt\live%DOMAIN%

REM Criando diretório para conversão dos certificados

mkdir temp_cert
cd temp_cert

REM 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%

REM 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%

REM Listando as chaves

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

REM Fim

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