HEX
Server: Apache
System: Linux vpshost0650.publiccloud.com.br 4.4.79-grsec-1.lc.x86_64 #1 SMP Wed Aug 2 14:18:21 -03 2017 x86_64
User: bandeirantesbomb3 (10068)
PHP: 8.0.7
Disabled: apache_child_terminate,dl,escapeshellarg,escapeshellcmd,exec,link,mail,openlog,passthru,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,php_check_syntax,php_strip_whitespace,popen,proc_close,proc_open,shell_exec,symlink,system
Upload Files
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