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.
- 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
- 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/
.
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 😃)
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
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.
Show :)