-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #17 from filiperochalopes/feature/certbot-ssl
feat: implement semi auto create and renew ssl certificates
- Loading branch information
Showing
15 changed files
with
146 additions
and
2,245 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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/) | ||
|
||
|
@@ -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 | ||
``` | ||
|
||
|
@@ -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) | ||
|
||
|
@@ -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> | ||
|
||
|
@@ -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) |
Oops, something went wrong.