Hoje (25/08/2017), a versão do Glassfish Open Source Edition mais recente e recomendada para uso em produção é a 4.1.2, que pode ser obtida nesta página: https://glassfish.java.net/download.html
Para usar o Glassfish 4 é necessário instalar o Java 8, que pode ser obtido neste link http://www.oracle.com/technetwork/java/javase/downloads/index.html e instalado no Ubuntu seguindo este tutorial: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
O Glassfish padrão contém algumas vulnerabilidades de segurança e para minimizá-las é necessário customizá-lo. Os valores padrão do Glassfish estão nesta página https://docs.oracle.com/cd/E26576_01/doc.312/e24928/overview.htm#GSADG00695
Os manuais do Glassfish estão disponíveis nesta página: https://glassfish.java.net/documentation.html
Customizando o Glassfish
1- Foi obtido o Glassfish 4.1.2 acessando a página http://download.java.net/glassfish/4.1.2/release/glassfish-4.1.2.zip. Com isso foi baixado o arquivo glassfish-4.1.2.zip no diretório /home/aecio/Downloads.
2- Descompacte o arquivo glassfish-4.1.2.zip e altere o nome da pasta descompactada para glassfishv4.
cd /home/aecio/Downloads
unzip glassfish-4.1.2.zip
mv glassfish4/ glassfishv4
3- Algumas configurações de segurança são listadas nestas páginas:
https://glassfish.java.net/docs/4.0/security-guide.pdf
https://community.oracle.com/thread/2362026?start=0&tstart=0
http://blog.eisele.net/2011/05/securing-your-glassfish-hardening-guide.html
https://dzone.com/articles/securing-your-glassfish
4- Mova o diretório glassfishv4 para o diretório /opt e aplique as permissões de acesso.
sudo mv /home/aecio/Downloads/glassfishv4 /opt
sudo chmod -R 700 /opt/glassfishv4
sudo chown -R root:root /opt/glassfishv4
5- Crie o arquivo /etc/init.d/glassfish com o seguinte conteúdo.
—————————- INICIO do /etc/init.d/glassfish ————————
#!/bin/bash
# chkconfig: 345 90 90
# description: glassfish (GLASSFISH) Web Server JAVA Aplication
#
### BEGIN INIT INFO
# Provides: glassfish
# Required-Start: $local_fs $network $syslog
# Should-Start: $remote_fs $named $time
# Required-Stop: $local_fs $network $syslog
# Should-Stop: $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: GLASSFISH
# Description: glassfish (GLASSFISH) Web Server JAVA Aplication
### END INIT INFO
#----------------------------------------------------
# informa se o usuario que estah rodando o comando eh root
isroot(){
MYUID=$(id | cut -d= -f2 | cut -d\( -f1)
[ $MYUID -eq 0 ] && echo YES || echo NO
}
#--------------------------------
getPID(){
PID=$(ps ax | pgrep -fl $GLASSFISHEXEC | sed "s/^ *//" | cut --field=1 --delimiter=" ")
echo $PID > $PID_FILE
}
#--------------------------------
isRunning(){
local PID="$1"
[ -z "$PID" ] && return 1
ps -p $PID > /dev/null 2>&1 && return 0 || return 1
}
#--------------------------------
status(){
getPID
[ -f $PID_FILE ] || return 3
PID=$(cat $PID_FILE )
if [ -z "$PID" ]; then
echo "[INFO] Glassfish is not running..."
return 1
fi
if isRunning $PID; then
echo "[INFO] Glassfish is running: PID=$PID"
return 0
else
echo "[INFO] Glassfish is not running..."
return 1
fi
}
#--------------------------------
stop(){
if [ ! -f $PID_FILE ]; then
echo "[INFO] Glassfish is not running..."
return 0
fi
PID=$(cat $PID_FILE )
[ -z "$PID" ] && return 0
if isRunning $PID ; then
echo "[INFO] Stopping Glassfish..."
kill -9 $PID
sleep 2
return 0
fi
}
#--------------------------------
start(){
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE )
if [ -z "$PID" ]; then
echo "[INFO] Starting Glassfish..."
$GLASSFISH_ASADMIN start-domain
getPID
return 0
fi
if isRunning $PID; then
echo "[INFO] Glassfish is already running. Use \"restart\""
return 0
else
echo "[INFO] Starting Glassfish..."
$GLASSFISH_ASADMIN start-domain
getPID
return 0
fi
else
echo "[INFO] Starting Glassfish..."
$GLASSFISH_ASADMIN start-domain
getPID
return 0
fi
}
#--------------------------------
# MAIN
#--------------------------------
#----- Variaveis
GLASSFISHEXEC=glassfishv4
GLASSFISHDIR=/opt/glassfishv4
GLASSFISHBINDIR=/opt/glassfishv4/glassfish/bin
GLASSFISH_ASADMIN=$GLASSFISHBINDIR/asadmin
PID_FILE=/tmp/glassfish.pid
if [ $(isroot) = NO ] ; then
echo "[ERROR] Voce deve ser root para executar este comando."
echo "Execute o comando \"sudo $CMDLINE\""
exit 4
fi
# Define usage string, used in more than one place.
usage="[INFO] Usage: $0 {start|stop|restart|status}"
# Check that we have one parameter: action
if [ $# -ne 1 ] ; then
if [ $# -lt 1 -o "$1" = "" ] ; then
echo "[ERROR] $0: action not specified"
else
echo "[ERROR] $0: too many parameters"
fi
echo "$usage"
exit 2
fi
action="$1"
case $action in
start)
start
RETURN=$?
;;
stop)
stop
RETURN=$?
;;
restart)
stop
start
RETURN=$?
;;
status)
status
RETURN=$?
;;
*)
# If we don't recognize action, consider it an invalid argument.
# If the standard adds actions we don't support, exit should be 3 for those.
echo "[ERROR] $0: action \"$action\" not recognized"
echo "$usage"
exit 3
;;
esac
exit $RETURN
———————– FIM do /etc/init.d/glassfish ———————-
6- Dê permissão de execução ao script /etc/init.d/glassfish.
sudo chmod 755 /etc/init.d/glassfish
sudo chown root:root /etc/init.d/glassfish
7- Habilite a inicialização do Glassfish no boot do Sistema Operacional.
sudo update-rc.d -f glassfish defaults
8- Inicie o Glassfish com o comando abaixo.
sudo /etc/init.d/glassfish start
9- O log do Glassfish fica em: /opt/glassfishv4/glassfish/domains/domain1/logs/ A porta padrão do HTTP é 8080, a porta padrão do HTTPS 8181 e a porta padrão do console administrativo é 4848.
10- Por padrão, a primeira senha do usuário admin do Glassfishv4 eh vazia. Altere-a com os seguintes comandos.
sudo /opt/glassfishv4/glassfish/bin/asadmin --user admin --port 4848 change-admin-password
sudo /etc/init.d/glassfish restart
Para persistir a nova senha, execute o comando abaixo, informe o login admin e depois a nova senha.
sudo /opt/glassfishv4/glassfish/bin/asadmin login
11- Habilite o acesso remoto a interface web do Glassfish com o comando abaixo.
sudo /opt/glassfishv4/glassfish/bin/asadmin enable-secure-admin
sudo /etc/init.d/glassfish restart
12- Desabilite o uso dos protocolos SSLv2, SSLv3, TLSv1, TLSv1.1 e cifras fracas na porta HTTPS e do console administrativo com os comandos abaixo.
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-2.ssl.ssl2-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-2.ssl.ssl3-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls11-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.ssl3-tls-ciphers=+TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,+TLS_DHE_DSS_WITH_AES_128_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA'
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.sec-admin-listener.ssl.ssl2-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.sec-admin-listener.ssl.ssl3-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.sec-admin-listener.ssl.ssl3-tls-ciphers=+TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,+TLS_DHE_DSS_WITH_AES_128_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA'
sudo /etc/init.d/glassfish restart
13- Ative o log de acesso ao Glassfish.
/opt/glassfishv4/glassfish/bin/asadmin set server.http-service.access-logging-enabled=true /opt/glassfishv4/glassfish/bin/asadmin set server.http-service.access-log.format=common /opt/glassfishv4/glassfish/bin/asadmin set server.http-service.virtual-server.server.access-logging-enabled=true
14- Use os comandos a seguir para mudar a porta padrão do HTTP para 80 e HTTPS para 443.
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.port=80
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-2.port=443
sudo /etc/init.d/glassfish restart
15- Se deseja habilitar o uso do certificado emitido por uma autoridade certificadora, siga os seguintes passos.
São necessários os seguintes arquivos:
ca-root.crt => certificado da entidade certificadora raíz.
ca-inter.crt => certificado intermediário da entidade certificadora, se houver.
hostname.pfx => arquivo contendo as chaves pública e privada do certificado emitido para um host ou domínio, geralmente ao invés de distribuir esses arquivos no formato .pfx, são distribuídos diretamente no padrão hostname.key (chave privada) e hostname.crt (certificado).
Crie o diretório /etc/certs para armazenar os certificados a serem usados pelo Glassfish.
sudo mkdir /etc/certs/
Copie os arquivos keystore.jks e cacerts.jks que existem no diretório do Glassfish para /etc/certs.
cd /opt/glassfishv4/glassfish/domains/domain1/config/
sudo cp keystore.jks cacerts.jks /etc/certs/
cd /etc/certs/
Cadastrando o certificado emitido no keystore.jks e cacerts.jks
Etapa 1) Como foi recebido o certificado hostname.pfx, será necessário extrair, a partir dele, os arquivos no formato .crt (certificado público) e .key (chave privada).
sudo openssl pkcs12 -in hostname.pfx -nocerts -nodes -out hostname.key
sudo openssl pkcs12 -in hostname.pfx -clcerts -nokeys -out hostname.crt
OBS.: Após cada comando acima informe a senha do arquivo hostname.pfx, usada na emissão do certificado.
openssl rsa -des3 -in hostname.key -out hostname_new.key
Etapa 2) Crie um arquivo keystore PKCS12 para armazenar a chave privada e do certificado público.
De posse dos arquivos .crt e .key, será necessário criar um arquivo keystore PKCS12, para unir as duas chaves novamente, mas em outro formato: o .p12.
sudo openssl pkcs12 -export -name my-cert -in hostname.crt -inkey hostname_new.key -out keystore.p12
OBS.: Na execução do comando acima, informe a senha da cópia da chave privada e, em seguida, crie uma nova senha para armazenar as chaves no formato .p12.
Etapa 3) Converta a chave do formato PKCS12 em uma keystore JKS.
Para converter a chave do formato .p12 para .jks, use o comando abaixo.
OBS.: A senha usada no armazenamento dos certificados no arquivo keystore.jks é: changeit.
sudo keytool -importkeystore -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias my-cert
Agora o arquivo keystore.jks está pronto.
Para listar o certificado importado, use o comando abaixo.
sudo keytool -list -keystore keystore.jks -alias my-cert -v
Etapa 4) Importe os certificados das entidades certificadoras
Importe para o arquivo cacerts.jks, os certificados das entidades certificadoras: ca-root.crt, ca-inter.crt (se existir).
OBS.: A senha usada no armazenamento dos certificados no arquivo cacerts.jks é: changeit.
sudo keytool -import -v -trustcacerts -alias ca-root -file ca-root.crt -keystore cacerts.jks -storepass changeit
sudo keytool -import -v -trustcacerts -alias ca-inter -file ca-inter.crt -keystore cacerts.jks -storepass changeit
Etapa 5) Importe os certificados das entidades certificadoras para o JKS padrão do JRE.
Adicione o certificado das autoridades certificadoras no JKS padrão da JRE do Java com os comandos abaixo.
sudo keytool -import -alias ca-root -keystore PATH_JRE/lib/security/cacerts -file ca-root.crt sudo keytool -import -alias ca-inter -keystore PATH_JRE/lib/security/cacerts -file ca-inter.crt
Onde: PATH_JRE, deve ser substituído pelo diretório de base da JRE. Por exemplo: /usr/lib/jvm/java-8-oracle/
OBS.: A senha usada no armazenamento dos certificados no arquivo cacerts.jks é: changeit.
Etapa 6) Cadastre o keystore.jks e cacerts.jks no Glassfishv4. Execute a sequência de comandos abaixo, mas alterando os valores em negrito de acordo com o seu ambiente.
sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.cert-nickname=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStore=/etc/certs/keystore.jks';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStorePassword=changeit';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.trustStore=/etc/certs/cacerts.jks';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.trustStorePassword=changeit';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStoreAlias=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyAlias=my-cert';
Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.
sudo /etc/init.d/glassfish restart
16) Execute os comandos abaixo para aplicar configurações de segurança no Glassfish
#disable client-initiated renegotiation (to decrease the surface for DoS attacks)
sudo /opt/glassfishv4/glassfish/bin/asadmin
create-jvm-options -Djdk.tls.rejectClientInitiatedRenegotiation=
true
#get rid of http header field value "server" (Glassfish obfuscation)
sudo /opt/glassfishv4/glassfish/bin/asadmin
create-jvm-options -Dproduct.name=
""
#disable sending x-powered-by in http header (Glassfish obfuscation)
sudo /opt/glassfishv4/glassfish/bin/asadmin
set
server.network-config.protocols.protocol.http-listener-1.http.xpowered-by=
false
sudo
/opt/glassfishv4/glassfish/bin/asadmin
set
server.network-config.protocols.protocol.http-listener-2.http.xpowered-by=
false
sudo
/opt/glassfishv4/glassfish/bin/asadmin
set
server.network-config.protocols.protocol.admin-listener.http.xpowered-by=
false
#disable SSLv3 nas portas iiop
sudo /opt/glassfishv4/glassfish/bin/asadmin
set
server.iiop-service.iiop-listener.SSL.ssl.ssl3-enabled=
false
sudo /opt/glassfishv4/glassfish/bin/asadmin
set
server.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.ssl3-enabled=
false
#enable only access local at console Web Admin Glassfish
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.network-listeners.network-listener.admin-listener.address=127.0.0.1
Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.
sudo /etc/init.d/glassfish restart
17) Execute a sequência de comandos abaixo se quiser redirecionar todo o tráfego da porta 80 para 443 automaticamente.
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol --securityenabled=false http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin create-http-redirect --redirect-port 443 --secure-redirect true http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol --securityenabled=false pu-protocol
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol
Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.
sudo /etc/init.d/glassfish restart
Criando um Pool de Acesso ao PostgreSQL no Glassfish
Se você tiver uma aplicação Web a ser implantada no Glassfish e que usa o banco de dados PostgreSQL, você pode usar os comandos para criar um recurso JDBC que usa o pool de conexões do Glassfish para gerenciar o acesso ao banco. Fazendo isso, será necessário que você ajuste o código da sua aplicação para ela usar o pool criado no Glassfish.
Abaixo estão os comandos para criar o pool e o recurso JDBC.
/opt/glassfishv4/glassfish/bin/asadmin create-jdbc-connection-pool --restype javax.sql.DataSource --datasourceclassname org.postgresql.ds.PGSimpleDataSource --maxpoolsize 100 --property "User=DBUSER:Password=DBPASSWORD:DatabaseName=DBASE:ServerName=DBHOST:PortNumber=DBPORTNUMBER" POOL_NAME
/opt/glassfishv4/glassfish/bin/asadmin create-jdbc-resource --connectionpoolid POOL_NAME RESOURCE_NAME
/etc/init.d/glassfish restart
Os comandos abaixo, confirguram a capacidade do pool de se reconectar ao banco de dados, em caso de perda de conexão.
/opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.connection-validation-method=custom-validation /opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.validation-classname=org.glassfish.api.jdbc.validation.PostgresConnectionValidation /opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.is-connection-validation-required=true /opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.fail-all-connections=true
/etc/init.d/glassfish restart
Deploy e undeploy de aplicação no Glassfish
/opt/glassfishv4/glassfish/bin/asadmin deploy --force=true --name=APP APP.war
/etc/init.d/glassfish restart
/opt/glassfishv4/glassfish/bin/asadmin undeploy --name=APP
/etc/init.d/glassfish restart
Fontes:
https://www.nabisoft.com/tutorials/glassfish/installing-glassfish-41-on-ubuntu
http://www.java-samples.com/showtutorial.php?tutorialid=1214
http://askubuntu.com/questions/587683/glassfish-ssl-console-handshake-exception
http://stackoverflow.com/questions/12860289/import-ssl-certificate-in-glassfish
https://www.nabisoft.com/tutorials/glassfish/installing-glassfish-41-on-ubuntu
http://grepthelinuxblog.blogspot.com.br/2012/02/glassfish-ssl-verisign-certificate.html
http://grburgos.blogspot.com.br/2010/07/glassfish-v3-with-ssl-using-verisign.html
https://glassfish.java.net/wiki-archive/How_to_ssl_versign.html
https://docs.oracle.com/cd/E19798-01/821-1751/ablqz/index.html
https://www.digicert.com/ssl-support/jks-import-export-java.htm
http://stackoverflow.com/questions/34726305/getting-ssl-certificate-to-work-with-payara-4-1/34808985
http://www.guj.com.br/t/sucesso-glassfish-v3-ssl-certificado-serasa-globalsign-etc/195965
http://www.denizoguz.com/2011/01/02/installing-godaddy-ssl-certificates-on-glassfish-v3-step-by-step/
Deixe um comentário