Skip to content

Instantly share code, notes, and snippets.

@rdeprera
Last active February 16, 2022 08:50
Show Gist options
  • Save rdeprera/682ecf48b3aaa63feadb71ace2431d6e to your computer and use it in GitHub Desktop.
Save rdeprera/682ecf48b3aaa63feadb71ace2431d6e to your computer and use it in GitHub Desktop.
Criação de certificado SSL auto-assinados para servidores HTTP
#!/usr/bin/env bash
#
# Modelo de certificado auto-assinados para teste SSL em virtualhosts em ambiente de testes
# Referências:
# https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-04
#
# TODO(rdeprera): criar .run apartir desse modelo
# TODO(rdeprera): descrever nos comentários cada uma das variáveis
## Valores prováveis para DIR_CERTIFICADOS:
# - /home/<usuario>/Documentos/certificados-ssl
# - /etc/httpd/httpscertificate
# - /etc/apache2/httpscertificate
DIR_CERTIFICADOS='/tmp/certificados' && \
## Diretório de Arquivos de Configurações do Servidor Web
# Valores prováveis:
# - /etc/apache/conf-available
# - /etc/apache2/conf-available
DIR_CONF_SW="/etc/apache2/conf-available" && \
## NOME_DO_CERTIFICADO
# valores prováveis:
# - 127.0.0.1.pem
# - dominio.com.pem
# - qualquercoisa.pem
NOME_DO_CERTIFICADO='localhost' && \
## CERTIFICADO
# Nome do arquivo do certificado.
# valores prováveis:
# - nome.crt
# - nome.pem
CERTIFICADO="${NOME_DO_CERTIFICADO}.crt" && \
## ARQ_CERTIFICADO
# valores prováveis:
# - /etc/apache/conf-available/ssl-params.conf
# - /etc/apache2/conf-available/ssl-params.conf
# - /home/<usuario>/.config/qualquercoisa.conf
CERTIFICADO_ARQ="${DIR_CONF_SW}/${CERTIFICADO}" && \
## Email do webmaster do Virtual Host
CONFIG_VH_EMAIL="rdeprera@gmail.com" && \
## Nome do Serviço do Servidor Web
SRV_WEB="apache2" && \
## Nome/IP do Virtual Host
# possíveis valores:
# - localhost
CONFIG_VH_NOME="${NOME_DO_CERTIFICADO}" && \
## Nome do Arquivo de Configuração do Módulo SSL do Servidor Web
CONFIG_SSL_SERVIDOR_WEB_ARQ_NOME="${NOME_DO_CERTIFICADO}-ssl-params" && \
## Valores prováveis para CONFIG_SSL_SERVIDOR_WEB
# - /etc/apache/conf-available/ssl-params.conf
# - /etc/apache2/conf-available/ssl-params.conf
# - /home/<usuario>/.config/qualquercoisa.conf
CONFIG_SSL_SERVIDOR_WEB_ARQ="${DIR_CONF_SW}/${CONFIG_SSL_SERVIDOR_WEB_ARQ_NOME}.conf" && \
## Diretório de Configuração do Virtual Host
# Valores prováveis:
# - /etc/apache/sites-available
# - /etc/apache2/sites-available
DIR_CONFIG_VH="/etc/apache2/sites-available" && \
## Nome do Arquivo de Configuração do Virtual Host SSL(https/443) (sem extensão .conf)
# possíveis valores
# - localhost-ssl
# - default-ssl
# - ... e outros
CONFIG_VH_ARQ_NOME="${NOME_DO_CERTIFICADO}-ssl" && \
## Nome do Arquivo de Configuração do Virtual Host
# Valores prováveis:
# - default-ssl.conf
# - default-ssl.conf
# - qualquercoisa.conf
CONFIG_VH_ARQ_NOME_EXT="${CONFIG_VH_ARQ_NOME}.conf" && \
## Arquivo de Configuração do Virtual Host
# Valores prováveis:
# - $DIR_CONFIG_VH/default-ssl.conf
# - $DIR_CONFIG_VH/qualquercoisa.conf
CONFIG_VH_ARQ="${DIR_CONFIG_VH}/${CONFIG_VH_ARQ_NOME_EXT}" && \
## Configuração do módulo SSL no Apache
CONFIG_SSL_SERVIDOR_WEB='\
# from https://cipherli.st/ \
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html \
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH \
SSLProtocol All -SSLv2 -SSLv3 \
SSLHonorCipherOrder On \
# Disable preloading HSTS for now. You can use the commented out header line that includes \
# the "preload" directive if you understand the implications. \
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" \
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" \
Header always set X-Frame-Options DENY \
Header always set X-Content-Type-Options nosniff \
# Requires Apache >= 2.4 \
SSLCompression off \
SSLSessionTickets Off \
SSLUseStapling on \
SSLStaplingCache "shmcb:logs/stapling-cache(150000)\
SSLOpenSSLConfCmd DHParameters "'${DIR_CERTIFICADOS}'/dhparam.pem"' \
cd /tmp && \
! test -d "$DIR_CERTIFICADOS" && mkdir -p $DIR_CERTIFICADOS \
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ${DIR_CERTIFICADOS}/${NOME_DO_CERTIFICADO}.key \
-out ${DIR_CERTIFICADOS}/${NOME_DO_CERTIFICADO}.crt && \
sudo openssl dhparam -out ${DIR_CERTIFICADOS}/dhparam.pem 2048 && \
## Backup do $CONFIG_SSL_SERVIDOR_WEB_ARQ ou cria o arquivo
if test -f "$CONFIG_SSL_SERVIDOR_WEB_ARQ"; then
sudo cp $CONFIG_SSL_SERVIDOR_WEB_ARQ "${CONFIG_SSL_SERVIDOR_WEB_ARQ}.bak"
test -f "${CONFIG_SSL_SERVIDOR_WEB_ARQ}.bak" && echo "Backup de arquivo de configuração SSL do servidor web criado em: ${CONFIG_SSL_SERVIDOR_WEB_ARQ}.bak"
else
sudo touch $CONFIG_SSL_SERVIDOR_WEB_ARQ
fi
## Gravação das configurações no arquivo $CONFIG_SSL_SERVIDOR_WEB_ARQ
sudo echo "$(cat $CONFIG_SSL_SERVIDOR_WEB)" > $CONFIG_SSL_SERVIDOR_WEB_ARQ && \
## Backup do $CONFIG_VH_ARQ
if test -f "$CONFIG_VH_ARQ"; then
sudo cp $CONFIG_VH_ARQ "${CONFIG_VH_ARQ}.bak"
fi
sudo systemctl stop $SRV_WEB && \
## Faz alterações no Arquivo de Configuração do Virtual Host
sudo sed -i "s|SSLCertificateFile $PARTITION_COLUMN.*|SSLCertificateFile ${CERTIFICADO_ARQ}|g" $CONFIG_VH_ARQ && \
sudo sed -i "s|ServerAdmin $PARTITION_COLUMN.*|ServerAdmin ${CONFIG_VH_EMAIL}|g" $CONFIG_VH_ARQ && \
sudo sed -i "s|ServerName $PARTITION_COLUMN.*|ServerName ${CONFIG_VH_NOME}|g" $CONFIG_VH_ARQ && \
sudo a2enmod ssl && \
sudo a2enmod headers && \
sudo a2ensite $CONFIG_VH_ARQ_NOME && \
sudo a2enconf $CONFIG_SSL_SERVIDOR_WEB_ARQ_NOME && \
sudo apache2ctl configtest && \
sudo systemctl restart $SRV_WEB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment