Skip to content

Commit

Permalink
Merge pull request #17 from filiperochalopes/feature/certbot-ssl
Browse files Browse the repository at this point in the history
feat: implement semi auto create and renew ssl certificates
  • Loading branch information
filiperochalopes authored Nov 28, 2024
2 parents 909b96b + a9a9c42 commit c76bf96
Show file tree
Hide file tree
Showing 15 changed files with 146 additions and 2,245 deletions.
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ POSTGRES_PASSWORD='esus'
POSTGRESQL_PORT=54351
APP_PORT=88
PGWEB_PORT=8099
TIMEZONE='America/Bahia'
TZ='America/Bahia'
7 changes: 3 additions & 4 deletions .env.external-db.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ POSTGRES_USER='postgres'
POSTGRES_PASSWORD='pass'
POSTGRES_HOST='host.docker.internal'
POSTGRES_PORT=5432
FILENAME="https://arquivos.esusab.ufsc.br/PEC/c0d1d77e70c98177/5.2.38/eSUS-AB-PEC-5.2.38-Linux64.jar"
FILENAME="https://arquivos.esusab.ufsc.br/PEC/e925378f33a611e7/5.3.19/eSUS-AB-PEC-5.3.19-Linux64.jar"
APP_PORT=8081
TIMEZONE='America/Bahia'
TZ='America/Bahia'
DUMPFILE='dumpfile.sql' # Esse arquivo deve estar na raiz do projeto, caso queira um banco de dados em branco, exclua a variável
APP_URL='https://exemplo.com'
CERTBOT_EMAIL='[email protected]'
HTTPS_DOMAIN='exemplo.gov.br'
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ __pycache__
*.pyc
*.backup
.webassets-cache
.vscode/
.env
client_secret_*.json
credentials.json
Expand All @@ -13,7 +14,11 @@ venv
*.java
pec.log
*.deb
*.log
docker-compose.npm.yml
*.sql
.env.external-db
esus-jar/
*entrypoint/
nginx/
esus-*/
certificates/
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ ARG TRAINING
ARG POSTGRES_USERNAME
ARG POSTGRES_PASSWORD
ARG POSTGRES_DATABASE
ARG TIMEZONE
ARG TZ
ARG DUMPFILE

ENV JAR_FILENAME=${JAR_FILENAME}
Expand All @@ -38,7 +38,7 @@ ENV TRAINING=${TRAINING}
ENV POSTGRES_USERNAME=${POSTGRES_USERNAME}
ENV POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
ENV POSTGRES_DATABASE=${POSTGRES_DATABASE}
ENV TIMEZONE=${TIMEZONE}
ENV TZ=${TZ}

RUN export JAR_FILENAME=${JAR_FILENAME}

Expand All @@ -53,4 +53,4 @@ COPY ./run.sh run.sh
RUN chmod +x /var/www/html/install.sh
RUN chmod +x /var/www/html/run.sh

CMD ["/bin/bash", "/var/www/html/run.sh"]
CMD ["/bin/bash", "/var/www/html/run.sh"]
27 changes: 18 additions & 9 deletions Dockerfile.external-db
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ RUN apt-get update && apt-get install -y \
&& apt-get install -y \
wget apt-utils gnupg2 software-properties-common file libfreetype6 ntp

# Instalando java 8, pre-requisitos para instalação do sistema PEC
RUN wget -O- https://apt.corretto.aws/corretto.key | apt-key add -
RUN add-apt-repository 'deb https://apt.corretto.aws stable main'
RUN apt-get update && apt-get install -y java-1.8.0-amazon-corretto-jdk
# Adicionar chave pública diretamente da URL correta
RUN wget -O - https://apt.corretto.aws/corretto.key | gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg

# Adicionar o repositório do Corretto, vinculando à chave
RUN echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | tee /etc/apt/sources.list.d/corretto.list

# Atualizar repositórios e instalar o Corretto 17 LTS
RUN apt-get update && apt-get install -y java-17-amazon-corretto-jdk

# Enable all repositories
RUN sed -i 's/# deb/deb/g' /etc/apt/sources.list
Expand All @@ -25,11 +29,18 @@ RUN apt-get update && \
rm -rf /usr/share/doc/* /usr/share/man/* /var/lib/apt/lists/* /tmp/* /var/tmp/*

ARG JAR_FILENAME
ARG HTTPS_DOMAIN
ARG DB_URL
ARG DB_PASS
ARG DB_USER
ARG DUMPFILE

# Promovendo ARGS para ENV
ENV JAR_FILENAME=${JAR_FILENAME}
ENV DB_URL=${DB_URL}
ENV DB_PASS=${DB_PASS}
ENV DB_USER=${DB_USER}

RUN mkdir -p /var/www/html
WORKDIR /var/www/html

Expand All @@ -42,9 +53,7 @@ COPY ./run-java.sh .
COPY *.sql .
COPY *.backup .

RUN chmod +x ./run-java.sh
RUN ./run-java.sh

RUN chmod +x /opt/e-SUS/webserver/standalone.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

CMD ["/bin/bash", "-c", "/opt/e-SUS/webserver/standalone.sh > /proc/1/fd/1 2>&1"]
ENTRYPOINT ["/entrypoint.sh"]
84 changes: 56 additions & 28 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,32 +1,60 @@
generate-ssl:
# Verifica se a URL foi fornecida
@if [ -z "$(url)" ]; then \
echo "Erro: É necessário fornecer a URL."; \
exit 1; \
fi

# Verifica se o email foi fornecido
@if [ -z "$(email)" ]; then \
echo "Erro: É necessário fornecer o email."; \
exit 1; \
fi
# Define a variável do domínio
DNS ?= pec.filipelopes.med.br

# Criação do certificado SSL usando Certbot
docker compose exec -it nginx sh -c "certbot certonly --webroot -w /var/www/certbot -d $(url) --email $(email) --agree-tos --non-interactive"
# Target para gerar SSL
generate-ssl:
docker run -it --rm --name certbot \
-v "./certificates:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
certbot/certbot certonly \
--manual --preferred-challenges dns \
-d $(DNS) \
--agree-tos --no-eff-email

# Colocar o certificado no nginx.conf
docker compose exec -it nginx sh -c "sed -i 's|# ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;|ssl_certificate /etc/letsencrypt/live/$(url)/fullchain.pem;|' /etc/nginx/nginx.conf"
docker compose exec -it nginx sh -c "sed -i 's|# ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;|ssl_certificate_key /etc/letsencrypt/live/$(url)/privkey.pem;|' /etc/nginx/nginx.conf"
# Target para converter certificados para JKS e instalar no PEC
install-ssl:
# Transformação de tipo de chave
docker compose exec -it pec sh -c '\
mkdir -p /opt/e-SUS/webserver/chaves && \
# Criar PKCS#12 \
openssl pkcs12 -export -in /certificates/live/$(DNS)/fullchain.pem \
-inkey /certificates/live/$(DNS)/privkey.pem \
-out /opt/e-SUS/webserver/chaves/keystore.p12 \
-name esuspec \
-CAfile /certificates/live/$(DNS)/chain.pem \
-caname root \
-password pass:$(PASS) && \
# Converter PKCS#12 para JKS \
keytool -importkeystore -deststorepass $(PASS) \
-destkeypass $(PASS) \
-destkeystore /opt/e-SUS/webserver/chaves/keystore.jks \
-srckeystore /opt/e-SUS/webserver/chaves/keystore.p12 \
-srcstoretype PKCS12 \
-srcstorepass $(PASS) \
-alias esuspec \
'

# Reiniciar Nginx no container
docker compose exec -it nginx sh -c "nginx -s reload"
# Colocando configurações no arquivo de configurações
docker compose exec -it pec sh -c '\
# Alterando porta \
sed -i "/^server.port=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.port=443" >> /opt/e-SUS/webserver/config/application.properties && \
# Alterando tipo de certificado \
sed -i "/^server.ssl.key-store-type=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.ssl.key-store-type=JKS" >> /opt/e-SUS/webserver/config/application.properties && \
# Alterando caminho do certificado \
sed -i "/^server.ssl.key-store=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.ssl.key-store=/opt/e-SUS/webserver/chaves/keystore.jks" >> /opt/e-SUS/webserver/config/application.properties && \
# Alterando senha do certificado \
sed -i "/^server.ssl.key-store-password=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.ssl.key-store-password=$(PASS)" >> /opt/e-SUS/webserver/config/application.properties && \
# Alterando alias do certificado \
sed -i "/^server.ssl.key-alias=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.ssl.key-alias=esuspec" >> /opt/e-SUS/webserver/config/application.properties && \
# Alterando flag de SSL \
sed -i "/^server.ssl.enabled=/d" /opt/e-SUS/webserver/config/application.properties && \
echo "server.ssl.enabled=true" >> /opt/e-SUS/webserver/config/application.properties \
'

# Instalar certificado no PEC
docker compose exec -it pec sh -c "cp /etc/letsencrypt/live/$(url)/fullchain.pem /opt/e-SUSwebserver/config/"
docker compose exec -it pec sh -c "cp /etc/letsencrypt/live/$(url)/privkey.pem /opt/e-SUSwebserver/config/"
docker compose exec -it pec sh -c "sed -i '\$$a\server.port=443' /opt/e-SUSwebserver/config/application.properties"
docker compose exec -it pec sh -c "sed -i '\$$a\server.ssl.key-store-type=PKCS12' /opt/e-SUSwebserver/config/application.properties"
docker compose exec -it pec sh -c "sed -i '\$$a\server.ssl.key-store=/opt/e-SUSwebserver/config/fullchain.pem' /opt/e-SUSwebserver/config/application.properties"
docker compose exec -it pec sh -c "sed -i '\$$a\server.ssl.key-store-password=REPLACE_WITH_PASSWORD' /opt/e-SUSwebserver/config/application.properties"
docker compose exec -it pec sh -c "sed -i '\$$a\server.ssl.key-alias=$(url)' /opt/e-SUSwebserver/config/application.properties"
docker compose exec -it pec sh -c "sed -i '\$$a\security.require-ssl=true' /opt/e-SUSwebserver/config/application.properties"
# Target para executar todas as etapas
all: generate-ssl install-ssl
59 changes: 15 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# eSUS PEC

Compatível e testado com
![version](https://img.shields.io/badge/version-5.2.38-green) ![version](https://img.shields.io/badge/version-5.2.28-green) ![version](https://img.shields.io/badge/version-4.2.8-red) ![version](https://img.shields.io/badge/version-4.2.7-red)
![version](https://img.shields.io/badge/version-5.3.19-green)

**BREAKING CHANGE:** Desde a versão 5.3 o certificado SSL é autogerenciado e a versão Java utilizada é a 17 LTS. A última versão desse docker não funcionará para versões anteriores

É um sistema bastante utilizado por profissionais de saúde da Atenção Básica para registros de pacientes e dados de saúde. Esse repositório se propõe a criar uma estrutura docker com linux para viabilizar o deploy do sistema em qualquer ambiente que tenha docker e facilitar a instalação e atualização do sistema [e-SUS PEC](https://sisaps.saude.gov.br/esus/)

Expand All @@ -10,7 +12,7 @@ Compatível e testado com
Baixe o jar da aplicação e execute o script de instalação para um banco de dados novo, use o argumento `-t` se quiser que a versão instalada seja de treinamento:

```sh
wget https://https://arquivos.esusab.ufsc.br/PEC/c0d1d77e70c98177/5.2.38/eSUS-AB-PEC-5.2.38-Linux64.jar
wget https://arquivos.esusab.ufsc.br/PEC/e925378f33a611e7/5.3.19/eSUS-AB-PEC-5.3.19-Linux64.jar
sh build.sh -f eSUS-AB-PEC-5.2.38-Linux64.jar
```

Expand All @@ -31,8 +33,9 @@ Dúvidas? Colaboração? Ideias? Entre em contato pelo [WhatsApp](https://wa.me
2. [Preparando pacotes](#preparando-pacotes)
3. [Instalação do PEC](#instalacao-pec)
4. [Versão de Treinamento](#versao-treinamento)
5. [Migração de Versão PEC](#migrando-versao)
6. [Outras informações relevantes](#outros)
5. [Certificado SSL](#certificado-ssl)
6. [Migração de Versão PEC](#migrando-versao)
7. [Outras informações relevantes](#outros)

Ajude esse e outros projetos OpenSource para saúde: [Patrocínio](#patrocinio)

Expand Down Expand Up @@ -105,53 +108,21 @@ Apoie também esse e outros projetos.
</a>
</div>

## Certificado SSL (Em processo de automatização)
## Certificado SSL (Processo semi automatizado) <a id="certificado-ssl"></a>

O certificado SSL é importante para podermos utilizar o
HTTPS (Habilita video chamadas e prescrição eletrônica, além de ser pré-requisito para login GOV.br). [Mais informações](https://saps-ms.github.io/Manual-eSUS_APS/docs/Apoio%20a%20Implanta%C3%A7%C3%A3o/Certificado_Https_Linux/)

```sh
# https://github.com/filiperochalopes/e-SUS-PEC/issues/14
make generate-ssl URL=https://meu-dominio.com [email protected]
```

### Por enquanto

Vamos fazer manualmente o processo que se constitui em:

1. Colocar o servidor para rodar na porta 80 (padrão vem 8080) e reiniciar container
O métido utilizado para verificação do DNS é o DNS-1, vai ser necessário cadastrar um registro TXT no DNS, para isso fique atento ao prompt no terminal ao executar o primeiro passo abaixo:

```sh
docker compose -f docker-compose.external-db.yml down pec
docker compose -f docker-compose.external-db.yml up -d pec
```

2. Adquirir um certificado para seu domínio da forma que preferir (certbot/Let's Encrypt)
3. Converter certificados em JKS

```sh
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name esuspec -CAfile chain.pem -caname root -password pass:mypass

keytool -importkeystore -deststorepass mypass -destkeypass mypass -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass mypass -alias esuspec
```
4. Colocar o servidor para rodar na porta 443, alterando o o arquivo `/opt/e-SUS/webserver/config/application.properties`

```sh
spring.datasource.url=jdbc:postgresql://noharm-dev.cnonw4s4vx7j.sa-east-1.rds.amazonaws.com:5432/esus?ssl=true&sslmode=allow&sslfactory=org.postgresql.ssl.NonValidatingFactory
spring.datasource.password=esus_pass
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.username=esus_user
server.port=443
# server.ssl.key-store-type=PKCS12
server.ssl.key-store=/opt/e-SUS/keystore.jks
server.ssl.key-store-password=esus_pass
server.ssl.key-alias=esuspec
security.require-ssl=true
# https://github.com/filiperochalopes/e-SUS-PEC/issues/14
make generate-ssl DNS=meu-dominio.com
sudo chmod -R 755 ./certificates
make install-ssl DNS=meu-dominio.com PASS=senha-certificado
```

### [Atualização de certificados](https://github.com/filiperochalopes/e-SUS-PEC/issues/14)

Ainda analisando como seria isso, e para automatizar, já que o processo de retornar para porta 80, rodar novamente o certbot e voltar para 443 poderia ser doloroso.
Para renovar basta repetir o processo acima.

## Versão de Treinamento <a id="versao-treinamento"></a>

Expand Down Expand Up @@ -275,4 +246,4 @@ docker-compose up -d esus_app /opt/e-SUS/webserver/standalone.sh

## Lista de Versões para Download

[![version](https://img.shields.io/badge/version-5.2.38-blue)](https://https://arquivos.esusab.ufsc.br/PEC/c0d1d77e70c98177/5.2.38/eSUS-AB-PEC-5.2.38-Linux64.jar) [![version](https://img.shields.io/badge/version-5.2.28-blue)](https://arquivos.esusab.ufsc.br/PEC/mtRazOmMxfBpkEMK/5.2.28/eSUS-AB-PEC-5.2.28-Linux64.jar)
[![version](https://img.shields.io/badge/version-5.3.19-blue)](https://arquivos.esusab.ufsc.br/PEC/e925378f33a611e7/5.3.19/eSUS-AB-PEC-5.3.19-Linux64.jar)
Loading

0 comments on commit c76bf96

Please sign in to comment.