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.

@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