PostgreSQL SSL · 7 min read · Dec 21, 2025
Como habilitar SSL para conexões PostgreSQL

Por padrão, todas as conexões PostgreSQL são inseguras, o que pode causar problemas de segurança quando executadas em ambientes de produção com alto tráfego. A criptografia SSL garante que qualquer dado transferido não seja interceptado por ninguém no meio de uma conexão.
Este tutorial ensinará como habilitar SSL/TLS para conexões PostgreSQL.
Pré-requisitos
- Um servidor Linux. Para nosso tutorial, estamos executando um servidor Ubuntu 22.04.
- Um usuário sudo não-root.
- Um nome de domínio totalmente qualificado (FQDN) como
postgresql.example.com. - Certifique-se de que tudo está atualizado.
$ sudo apt update $ sudo apt upgrade - Alguns pacotes que seu sistema precisa.
$ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -yAlguns desses pacotes podem já estar instalados em seu sistema.
Passo 1 - Configurar o Firewall
Antes de instalar quaisquer pacotes, o primeiro passo é configurar o firewall para abrir portas para HTTP, HTTPS e PostgreSQL.
Verifique o status do firewall.
$ sudo ufw status
Você deve ver algo como o seguinte.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Abra as portas HTTP, HTTPS e PostgreSQL no firewall.
$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https
Verifique o status novamente para confirmar.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
5432 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
5432 (v6) ALLOW Anywhere (v6)
Passo 2 - Instalar PostgreSQL 14
O Ubuntu 22.04 vem com o PostgreSQL 14 por padrão. Para instalar, emita o seguinte comando.
$ sudo apt install postgresql postgresql-contrib
O pacote postgresql-contrib contém algumas utilidades extras.
Você também pode usar o repositório APT oficial do PostgreSQL para instalar. Execute o seguinte comando para adicionar a chave GPG do PostgreSQL.
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Adicione o repositório APT à sua lista de fontes.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Atualize o repositório do sistema.
$ sudo apt update
Agora, você pode instalar o PostgreSQL usando o comando mencionado acima.
Verifique o status do serviço PostgreSQL.
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
Main PID: 3497 (code=exited, status=0/SUCCESS)
CPU: 1ms
Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.
Você pode ver que o serviço está habilitado e em execução por padrão.
Defina a senha para a conta postgres.
$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"
Passo 3 - Instalar SSL
Para instalar um certificado SSL usando o Let’s Encrypt, precisamos baixar a ferramenta Certbot. Usaremos o instalador de pacotes Snapd para isso. O Ubuntu 22.04 vem pré-instalado com o Snap.
Certifique-se de que sua versão do Snapd está atualizada.
$ sudo snap install core
$ sudo snap refresh core
Instale o Certbot.
$ sudo snap install --classic certbot
Use o seguinte comando para garantir que o comando Certbot seja executado criando um link simbólico para o diretório /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Gere um certificado SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com
O comando acima fará o download de um certificado para o diretório /etc/letsencrypt/live/postgresql.example.com em seu servidor.
Gere um certificado grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Passo 4 - Configurar a renovação do Certbot para PostgreSQL
O PostgreSQL não tem permissão para acessar os certificados da pasta Let’s Encrypt, portanto, não podemos dizer a ele para usar os certificados da pasta diretamente. A alternativa é copiar os certificados para o diretório do PostgreSQL, mas isso funciona apenas temporariamente, pois eles expirarão e você terá que copiá-los novamente manualmente.
O melhor método é usar um hook de renovação que será executado automaticamente em cada renovação e realizará as operações de cópia.
Procure o diretório de dados do PostgreSQL.
$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'
Crie o arquivo de hook de renovação e abra-o para edição.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Cole o seguinte código nele.
#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# apenas para SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Torne o arquivo executável.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Passo 5 - Configurar PostgreSQL
Encontre o caminho para o arquivo de configuração do PostgreSQL.
$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'
Abra o arquivo para edição.
$ sudo nano /etc/postgresql/15/main/postgresql.conf
Localize a seção Configurações de Conexão e descomente a variável listen_address e altere seu valor para *. Certifique-se de que fique assim.
listen_address = '*' # em qual IP(s) escutar;
Localize a seção SSL e edite o arquivo para corresponder aos seguintes valores.
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Passo 6 - Configurar Conexão PostgreSQL
Abra o arquivo /etc/postgresql/15/main/pg_hba.conf para edição.
$ sudo nano /etc/postgresql/15/main/pg_hba.conf
Adicione a seguinte linha para habilitar SSL para PostgreSQL.
hostssl all all 0.0.0.0/0 scram-sha-256
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Passo 7 - Renovar Certificado
Execute o seguinte comando para realizar uma renovação forçada. Isso acionará o script de implantação que copia os certificados para o local correto para uso do PostgreSQL.
$ sudo certbot renew --force-renewal
Verifique se os certificados foram copiados para o diretório de dados do PostgreSQL.
$ sudo ls /var/lib/postgresql/15/main/
Você verá a seguinte saída que mostrará os certificados.
base pg_dynshmem pg_notify pg_snapshots pg_subtrans PG_VERSION postgresql.auto.conf server.crt
global pg_logical pg_replslot pg_stat pg_tblspc pg_wal postmaster.opts server.key
pg_commit_ts pg_multixact pg_serial pg_stat_tmp pg_twophase pg_xact postmaster.pid
Reinicie o PostgreSQL para aplicar as alterações.
$ sudo systemctl restart postgresql
Passo 8 - Testar a Conexão
Conecte-se ao banco de dados de outra máquina com o cliente PostgreSQL instalado.
$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres
Você deve ver o seguinte prompt do PostgreSQL. Estamos usando um cliente com PostgreSQL 14, portanto, você verá um aviso sobre versões incompatíveis.
Senha para o usuário postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), servidor 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
AVISO: versão principal do psql 14, versão principal do servidor 15.
Alguns recursos do psql podem não funcionar.
Conexão SSL (protocolo: TLSv1.3, cifra: TLS_AES_256_GCM_SHA384, bits: 256, compressão: off)
Digite "help" para ajuda.
postgres=#
Isso confirma uma conexão SSL bem-sucedida.
Saia do shell.
postgres=# \q
Se seu aplicativo estiver usando uma string de conexão, use-a no seguinte formato para uma conexão SSL.
postgres://user:[email protected]:5432/database_name?sslmode=require
Você pode alterar o modo SSL para verify-full ou verify-ca se tiver o certificado raiz do Let’s Encrypt disponível no local /var/lib/postgresql/.postgresql no lado do cliente.
Crie o diretório /var/lib/postgresql/.postgresql.
$ sudo mkdir -p /var/lib/postgresql/.postgresql
O certificado raiz do Let’s Encrypt é ISRG Root X1, que está localizado no servidor no caminho /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.
Copie o certificado raiz para o diretório /var/lib/postgresql/.postgresql.
$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt
Teste a conexão usando o modo verify-full ou verify-ca e você deve ver uma conexão bem-sucedida.
Passo 9 - Verificar os Clientes
Faça login no shell do PostgreSQL no servidor.
$ sudo -i -u postgres psql
Execute o seguinte comando SQL para verificar os clientes conectados.
SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;
Você deve ver uma saída semelhante.
pid | usename | datname | ssl | version | cipher | bits | client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
5126 | postgres | postgres | t | TLSv1.3 | TLS_AES_256_GCM_SHA384 | 256 | 122.161.84.220
5154 | postgres | postgres | f | | | |
(2 rows)
Isso confirma a conexão do cliente do lado do servidor.
Conclusão
Isso conclui o tutorial sobre como habilitar SSL nas conexões PostgreSQL. Se você tiver alguma dúvida, poste nos comentários abaixo.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.