File: //usr/local/locaweb/bin/lwcorp_apache2_configura_ssl.sh
#!/bin/bash
# FUNCTIONS
. /etc/lwcorp/lwcorp.functions
SSLCONFIGDATE="$(date +%Y%m%d)"
# Chama o function configtest. Se houver algum erro no apache, o script para aqui.
configtest
if [ $? -ne "0" ];then
echo "$LOGDATE - [Existe um erro no 'configtest' do Httpd. Processo abortado]" >> $LOGFILE
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nEXISTE UM ERRO NO CONFIGTEST DO APACHE.\n\nCORRIJA ISSO ANTES DE PROSSEGUIR." 9 65
exit 1
fi
# Analista seleciona 'ssl_exclusivo' ou 'restaurar_websiteseguro':
INIT_ACT=`dialog --backtitle "$LWCORPHEADER" --stdout \
--radiolist "\n SELECIONE A ACAO DESEJADA:" \
0 0 0 \
"SSL PROPRIO" 'Configura SSL proprio em uma hospedagem do servidor;' off \
"WEBSITESEGURO" 'Configura websiteseguro em uma hospedagem do servidor.' off`
# Verifica opcao selecionada:
case $INIT_ACT in
"SSL PROPRIO")
echo "$LOGDATE - [Analista selecionou configuracao de SSL proprio]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEATENCAO" --msgbox "\nANTES DE PROSSEGUIR, ATENTE-SE AOS SEGUINTES PONTOS:\n\n * AS CHAVES NAO DEVEM SER DECLARADAS EM FORMATO .PEM;\n * A CADEIA DE CERTIFICADOS DEVE FECHAR CORRETAMENTE;\n * NAO DEVE HAVER CARACTER A MAIS OU A MENOS NAS CHAVES.\n\nIMPORTANTE:\n\nCASO A CADEIA DO CERTIFICADO NAO FECHE OU HAJA CARACTERES INVALIDOS NAS CHAVES, O APACHE NAO VAI SUBIR." 16 100;
SSLEXCLUVISO="true";;
"WEBSITESEGURO")
echo "$LOGDATE - [Analista selecionou configuracao do certificado websiteseguro]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEATENCAO" --msgbox "\nO CERTIFICADO WEBSITESEGURO SERA CONFIGURADO.\n\nA SEGUIR, INFORME A HOSPEDAGEM." 9 55;
WEBSITESEGURO="true";;
*)
echo "$LOGDATE - [Analista nao selecionou uma acao e/ou cancelou a configuracao de SSL]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCONFIGURACAO CANCELADA." 7 65;
exit 1;;
esac
# Seleciona o login da hospedagem
FTPUSER=$(dialog --backtitle "$LWCORPHEADER" --title "LOGIN DE FTP" --stdout --inputbox "\nINFORME O LOGIN DE FTP DA hospedagem:\n" 10 55)
if [ -z $FTPUSER ];then
# Caso o analista nao tenha selecionado nada, script encerra:
echo "$LOGDATE - [Analista nao selecionou a hospedagem e/ou cancelou a configuracao de SSL]" >> $LOGFILE
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCONFIGURACAO CANCELADA." 7 65
exit 1
else
echo "$LOGDATE - [Analista informou o usuario $FTPUSER]" >> $LOGFILE
fi
# Valida o usuario informado. Primeiro, eh feita uma busca no passwd.
# Hoje, os usuarios do G2 Debian ficam no Ldap:
getent passwd $FTPUSER >/dev/null
# Verifica se retornou o usuario:
if [ $? -ne "0" ]; then
# Ve se o analista nao informou um user ou teclou esc, entra nesta condicao:
echo "$LOGDATE - [Analista informou usuario inexistente. Cancelada configuracao de SSL]" >> $LOGFILE
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nUSUARIO NAO ENCONTRADO.\n\nFINALIZANDO A CONFIGURACAO." 9 65
exit 1
fi
#
# RESTAURAR WEBSITESEGURO
#
# Entra aqui se o analista selecionar a opcao de websiteseguro:
if [[ "$WEBSITESEGURO" == "true" ]]; then
dialog --backtitle "$LWCORPHEADER" --title "$TITLECONFIRMACAO" --yesno "VALIDANDO INFORMACOES:\n\n VOCE DESEJA RESTAURAR O CERTIFICADO WEBSITESEGURO PARA A HOSPEDAGEM ABAIXO? \n\n * LOGIN DA HOSPEDAGEM => $FTPUSER\n\nATENCAO: ESTA CONFIGURACAO REQUER UM RESTART DO HTTPD. DESEJA PROSSEGUIR?" 11 100
case $? in
0) echo ""; echo "INICIANDO CONFIGURACAO..."; echo "";;
1) echo "$LOGDATE - [Analista cancelou a configuracao]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLECANCELADA" --msgbox "\n CONFIGURACAO CANCELANDA. \n" 8 65; exit 1;;
esac
# Declaro o caminho fisico para validar existencia dos certs:
SSLCERT="/etc/httpd/conf/websiteseguro/websiteseguro_com.crt"
SSLKEY="/etc/httpd/conf/websiteseguro/websiteseguro_com.key"
SSLCACERT="/etc/httpd/conf/websiteseguro/websiteseguro_com_CA.crt"
# Verifica se as chaves existem:
if [ -e "$SSLCERT" ] && [ -e "$SSLKEY" ] && [ -e "$SSLCACERT" ];then
# Redefine o valor das variaveis escapando o caractere / por conta do Sed que usaremos a seguir
SSLCERT="\/etc\/httpd\/conf\/websiteseguro\/websiteseguro_com.crt"
SSLKEY="\/etc\/httpd\/conf\/websiteseguro\/websiteseguro_com.key"
SSLCACERT="\/etc\/httpd\/conf\/websiteseguro\/websiteseguro_com_CA.crt"
SSLCAPATH="\/etc\/httpd\/conf\/websiteseguro\/"
# Caminho absoluto do arquivo de vhosts da hospedagem:
SSL_VHOST="/etc/locaweb/hospedagem/${FTPUSER}.conf"
# Remove flag Imutavel
chattr -i $SSL_VHOST
# Backup do vhost atual:
cp ${SSL_VHOST} ${SSL_VHOST}.lwcorp.$(date +%Y%m%d).sslconfig
# Remove a configuracao atual (se houver)
sed -i "/SSLCACertificatePath/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCACertificateFile/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCertificateKeyFile/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCertificateFile/d" $SSL_VHOST 2> /dev/null
# Configurando o certificado no Vhost
sed -i "/SSLEngine on/{p;s/.*/ SSLCACertificatePath ${SSLCAPATH} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCACertificateFile ${SSLCACERT} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCertificateKeyFile ${SSLKEY} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCertificateFile ${SSLCERT} /}" $SSL_VHOST
# Validando as modificacoes:
grep "SSLCertificateFile" $SSL_VHOST > /dev/null && grep "SSLCACertificateFile" $SSL_VHOST > /dev/null
# Se algo der errado, entrara aqui:
case $? in
0) ;;
*) echo "$LOGDATE - [Erro ao setar certificado websiteseguro no vhost do user $FTPUSER ]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "ERRO AO SETAR CHAVES NO VHOST. VERIFICAR." 7 65; exit 1;;
esac
# Faz um configtest pra ter certeza que tudo esta bem:
/usr/sbin/apachectl configtest 2> /dev/null
# Se nao tiver bem, dara o erro abaixo:
case $? in
0) ;;
*) echo "$LOGDATE - [Erro no configtest do Httpd apos configuracao do SSL]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nERRO NO CONFIGTEST APOS CONFIGURACAO DE SSL.\n\nVERIFIQUE AS CHAVES QUE UTILIZOU OU PECA AJUDA." 9 65; exit 1;;
esac
# Se chegar ate aqui, eh pq tudo esta bem. Vamos reiniciar o Apache:
systemctl restart httpd > /null
# Por fim, vamos travar o vhost do cliente com a flag imutavel:
chattr +i $SSL_VHOST
case $? in
0) echo "$LOGDATE - [Configuracao de SSL websiteseguro para o site do login $FTPUSER concluida com sucesso]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEINFO" --msgbox "\nCONFIGURACAO DE SSL CONCLUIDA COM SUCESSO." 7 65; exit 0;;
*) echo "$LOGDATE - [Ocorreu um erro no reinicio do Httpd pos configuracao do SSL para o login $FTPUSER]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nOCORREU UM ERRO NO REINICIO DO HTTPD." 7 65; exit 1;;
esac
else
echo "$LOGDATE - [Ocorreu um erro. O wildcard websiteseguro nao foi encontrado]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCERTIFICADO WILDCARD NAO ENCONTRADO." 7 65; exit 1
fi
fi
#
# CONFIGURACAO DE CERTIFICADO PROPRIO
#
if [[ "$SSLEXCLUVISO" == "true" ]]; then
dialog --backtitle "$LWCORPHEADER" --msgbox "\nVOCE PRECISARA DE 3 ARQUIVOS:\n\n* Certificado (Geralmente .crt ou .cer)\n* Certificado Intermediario CA\n* Chave privada (Geralmente .key).\n" 11 65
# Seleciona o Certificado:
echo "$LOGDATE - [Solicitado o Certificado ao Analista]" >> $LOGFILE;
CUSTOMER_CERT=$(dialog --backtitle "$LWCORPHEADER" --title "CERTIFICADO" --stdout --inputbox "\nINFORME PATH COMPLETO DO CERTIFICADO:\n" 10 55)
echo "$LOGDATE - [Solicitado o Key ao Analista]" >> $LOGFILE;
CUSTOMER_KEY=$(dialog --backtitle "$LWCORPHEADER" --title "KEY" --stdout --inputbox "\nINFORME O PATH COMPLETO DO KEY:\n" 10 55)
echo "$LOGDATE - [Solicitado o CA ao Analista]" >> $LOGFILE;
CUSTOMER_CA=$(dialog --backtitle "$LWCORPHEADER" --title "CA" --stdout --inputbox "\nINFORME O PATH COMPLETO DO CA:\n" 10 55)
# Verifica se os dados foram informados e se sao validos:
# CERTIFICADO:
if [ -z $CUSTOMER_CERT ]; then
echo "$LOGDATE - [Analista nao informou o certificado]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCERTIFICADO INVALIDO OU NAO INFORMADO." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
else
if [ -e $CUSTOMER_CERT ]; then
cert_hash="`openssl x509 -in $CUSTOMER_CERT -pubkey -noout -outform cert | sha256sum`"
else
echo "$LOGDATE - [Path do Certificado invalido]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nVERIFIQUE O PATH DO CERTIFICADO." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
fi
# KEY:
if [ -z $CUSTOMER_KEY ]; then
echo "$LOGDATE - [Analista nao informou o Key]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nKEY INVALIDA OU NAO INFORMADA." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
else
if [ -e $CUSTOMER_KEY ]; then
key_hash="`openssl pkey -in $CUSTOMER_KEY -pubout -outform pem | sha256sum`"
else
echo "$LOGDATE - [Path do Key invalido]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nVERIFIQUE O PATH DA KEY." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
fi
if [[ -z $cert_hash ]] || [[ -z $key_hash ]]; then
echo "$LOGDATE - [Nao foi possivel verificar se chaves publica e privada batem]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nNAO FOI POSSIVEL VERIFICAR A COMPATIBILIDADE DAS CHAVES PUBLICAS E PRIVADA." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
if [[ "$cert_hash" != "$key_hash" ]]; then
echo "$LOGDATE - [Chaves publica e privada nao batem]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nAS CHAVES PUBLICA E PRIVADA NAO BATEM. VERIFIQUE O CERTIFICADO/KEY." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
# CA:
if [ -z $CUSTOMER_CA ]; then
echo "$LOGDATE - [Analista nao informou o CA]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCA INVALIDO OU NAO INFORMADO." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
else
if [ -e $CUSTOMER_CA ]; then
openssl verify -verbose -x509_strict $CUSTOMER_CA | awk '{print$2}' | grep -w OK > /dev/null
if [[ "$?" != "0" ]]; then
echo "$LOGDATE - [Certificado CA invalido]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nCERTIFICADO CA INVALIDO." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
else
echo "$LOGDATE - [Path do arquivo CA invalido]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nVERIFIQUE O PATH DO CA." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
fi
# Se tudo correu bem, define as seguintes variaveis:
YEAR="$(date +%Y)"
MONTH="$(date +%m)"
DAY="$(date +%d)"
SSL_VHOST="/etc/locaweb/hospedagem/${FTPUSER}.conf"
SSLCERT_REALPATH="/etc/httpd/conf/${FTPUSER}/${YEAR}_${MONTH}_${DAY}/${FTPUSER}.crt"
SSLKEY_REALPATH="/etc/httpd/conf/${FTPUSER}/${YEAR}_${MONTH}_${DAY}/${FTPUSER}.key"
SSLCACERT_REALPATH="/etc/httpd/conf/${FTPUSER}/${YEAR}_${MONTH}_${DAY}/${FTPUSER}.ca"
# Copia as chaves do cliente:
echo "$LOGDATE - [Copiando chaves do certificado]" >> $LOGFILE;
mkdir -p /etc/httpd/conf/${FTPUSER}/${YEAR}_${MONTH}_${DAY}
cp $CUSTOMER_CERT $SSLCERT_REALPATH
cp $CUSTOMER_KEY $SSLKEY_REALPATH
cp $CUSTOMER_CA $SSLCACERT_REALPATH
if [ -e "$SSLCERT_REALPATH" ] && [ -e "$SSLKEY_REALPATH" ] && [ -e "$SSLCACERT_REALPATH" ]; then
echo "$LOGDATE - [Chaves copiadas]" >> $LOGFILE;
SSLCERT="\/etc\/httpd\/conf\/${FTPUSER}\/${YEAR}_${MONTH}_${DAY}\/${FTPUSER}.crt"
SSLKEY="\/etc\/httpd\/conf\/${FTPUSER}\/${YEAR}_${MONTH}_${DAY}\/${FTPUSER}.key"
SSLCACERT="\/etc\/httpd\/conf\/${FTPUSER}\/${YEAR}_${MONTH}_${DAY}\/${FTPUSER}.ca"
SSLCAPATH="\/etc\/httpd\/conf\/${FTPUSER}\/${YEAR}_${MONTH}_${DAY}\/"
chmod -R 755 $SSLCAPATH
chown aka:aka $SSLCAPATH
else
echo "$LOGDATE - [Uma ou mais chaves do certificado nao foram copiadas]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nUM OU MAIS CHAVES NAO FORAM COPIADAS." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
echo -e "\nINICIANDO CONFIGURACAO...\n"
# Remove flag imutavel pra edicao:
echo "$LOGDATE - [Removendo FLAG imutavel do vhost do cliente]" >> $LOGFILE;
chattr -i $SSL_VHOST
# Backup do vhost atual:
cp ${SSL_VHOST} ${SSL_VHOST}.lwcorp.$(date +%Y%m%d).sslconfig
# Remove a configuracao atual (se houver)
sed -i "/SSLCACertificatePath/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCACertificateFile/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCertificateKeyFile/d" $SSL_VHOST 2> /dev/null
sed -i "/SSLCertificateFile/d" $SSL_VHOST 2> /dev/null
echo "$LOGDATE - [Aplicando novas chaves no Vhost]" >> $LOGFILE;
sed -i "/SSLEngine on/{p;s/.*/ SSLCACertificatePath ${SSLCAPATH} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCACertificateFile ${SSLCACERT} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCertificateKeyFile ${SSLKEY} /}" $SSL_VHOST
sed -i "/SSLEngine on/{p;s/.*/ SSLCertificateFile ${SSLCERT} /}" $SSL_VHOST
# Verifica se as chaves foram ajustadas no vhost:
grep "SSLCertificateFile" $SSL_VHOST > /dev/null && grep "SSLCACertificateFile" $SSL_VHOST > /dev/null && grep "SSLCertificateKeyFile" $SSL_VHOST > /dev/null
# Verifica a saida do comando acima. Se for diferente de 0, deu ruim:
if [ $? -eq 0 ]; then
echo "$LOGDATE - [Chaves aplicadas com sucesso no Vhost do cliente]" >> $LOGFILE;
else
echo "$LOGDATE - [Falha ao aplicar novas chaves no Vhost]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "ERRO AO SETAR CHAVES NO VHOST. POR FAVOR, VERIFICAR." 7 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
# Configtest antes de reiniciar ao Apache:
echo "$LOGDATE - [Validando configuracao do Apache pos configuracao das chaves]" >> $LOGFILE;
/usr/sbin/apachectl configtest 2> /dev/null
if [ $? -eq 0 ]; then
echo "$LOGDATE - [Configuracao do Apache validada com sucesso]" >> $LOGFILE;
else
echo "$LOGDATE - [Erro no configtest do Apache pos configuracao de chaves.]" >> $LOGFILE;
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nERRO NO CONFIGTEST APOS CONFIGURACAO DE SSL.\n\nVERIFIQUE AS CHAVES QUE UTILIZOU OU PECA AJUDA." 9 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
# Por fim, se tudo correu bem, reinicia o Apache:
echo "$LOGDATE - [Reiniciando o Apache...]" >> $LOGFILE;
systemctl restart httpd > /null
if [ $? -eq 0 ]; then
echo "$LOGDATE - [Configuracao de SSL para o site user $FTPUSER concluida com sucesso]" >> $LOGFILE
dialog --backtitle "$LWCORPHEADER" --title "$TITLEINFO" --msgbox "\nCONFIGURACAO DE SSL CONCLUIDA COM SUCESSO." 7 65
exit 0
else
echo "$LOGDATE - [Erro no configtest do Apache pos configuracao de chaves.]" >> $LOGFILE
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nERRO NO CONFIGTEST APOS CONFIGURACAO DE SSL.\n\nVERIFIQUE AS CHAVES QUE UTILIZOU OU PECA AJUDA." 9 65
echo "$LOGDATE - [Execucao encerrada]" >> $LOGFILE;
exit 1
fi
else
dialog --backtitle "$LWCORPHEADER" --title "$TITLEERRO" --msgbox "\nNENHUMA OPCAO VALIDA FOI SELECIONADA." 7 65
exit 1
fi