Suponha que haja um servidor PostgreSQL em execução e com SSL ativado. Usando ferramentas Linux e PostgreSQL "padrão", como posso examinar seu certificado SSL?
Espero uma saída semelhante à que você obteria executando openssl x509 -text ...
. E espero uma resposta de linha de comando de uma ou duas linhas, para não ter que recorrer à execução de um farejador de pacotes.
Não tenho acesso ao servidor PostgreSQL, portanto não posso consultar seus arquivos de configuração diretamente.
Não tenho login de superusuário, então não consigo pegar o valor da ssl_cert_file
configuração e depois pg_read_file
nele.
Usar openssl s_client -connect ...
não funciona porque o PostgreSQL parece não querer fazer o handshake SSL imediatamente.
Em uma rápida olhada na psql
documentação, não consegui encontrar um parâmetro de linha de comando que mostre essas informações na inicialização. (Embora me mostre certas informações cifradas.)
Parece que a
s_client
ferramenta do OpenSSL adicionou suporte ao Postgres usando o-starttls
em 1.1.1, então agora você pode usar todo o poder das ferramentas de linha de comando do OpenSSL sem scripts auxiliares adicionais:Referências:
Seguindo a ideia do comentário de Craig Ringer:
...Eu escrevi uma fábrica de soquete SSL simples. Copiei o código da própria
NonValidatingFactory
classe do PgJDBC e apenas adicionei código para imprimir os certificados.Aqui está o que parecia, quando tudo foi dito e feito:
Se você não quiser se preocupar em instalar o java e compilar e já tiver o python, tente este script python: https://github.com/thusoy/postgres-mitm/blob/master/postgres_get_server_cert.py
Eu o uso para verificar as datas dos certificados:
Ou para o certificado completo como texto:
A resposta de csd realmente me salvou. Aqui está um passo a passo mais detalhado para aqueles de nós que não conhecem ou se esqueceram do java.
Certifique-se de que seu servidor pode compilar java. Tente o comando "which javac", se ele gerar algo como "... no javac in ..." então você precisa instalar um JDK (o JRE não funcionará, ele tem "java" mas não "javac").
Instale o postgresql-jdbc se ainda não o tiver. Para RHEL6, o comando é "yum install postgresql-jdbc". Descubra onde os arquivos jar estão instalados. Haverá vários deles, um para cada versão. Eu usei "/usr/share/java/postgresql-jdbc3.jar".
Copie o código do csd e insira as informações do banco de dados (a outra resposta) ou use minha versão ligeiramente modificada no final desta resposta. Salve-o em um arquivo chamado exatamente "ShowPostgreSQLCert.java". Maiúsculas/minúsculas importam, chame de qualquer outra coisa e não compilará.
No diretório com o arquivo ShowPostgreSQLCert.java, execute o seguinte comando (modifique o local de postgresql-jdbc3.jar, se necessário): "javac -cp /usr/share/java/postgresql-jdbc3.jar ShowPostgreSQLCert.java". Agora você deve ter 3 arquivos .class no mesmo diretório.
Por fim, execute o seguinte comando: "java -cp .:/usr/share/java/postgresql-jdbc3.jar ShowPostgreSQLCert". O "." depois de "-cp" significa que ele deve procurar no diretório atual pelos arquivos .class. Você pode inserir o caminho completo para os arquivos de classe aqui, apenas lembre-se de manter o ":" entre o caminho e o local do arquivo .jar.
Se você precisa executar o comando em uma máquina diferente, você precisa ter o mesmo arquivo jar instalado (postgresql-jdbc3.jar), ou provavelmente pode apenas copiá-lo do servidor em que você compilou os arquivos .class. Em seguida, basta copiar os arquivos .class e executar o comando de 5. depois de modificar os caminhos.
Modifiquei ligeiramente o código para que você possa passar as informações do banco de dados na linha de comando em vez de compilá-las no arquivo .class. Basta executá-lo sem nenhum argumento e ele exibirá uma mensagem mostrando quais argumentos ele espera. o código + modificações do csd é:
Adicionei algum código de https://stackoverflow.com/questions/3313020/write-x509-certificate-into-pem-formatted-string-in-java para gerar os certificados como PEM e removi a necessidade de especificar um db, nome de usuário ou senha (não são necessários para obter o certificado).
Usando isso, pude verificar que uma reinicialização do PostgreSQL infelizmente parece necessária para mudar para um novo certificado.
Não sendo um desenvolvedor Java, minhas etapas para construir e executar provavelmente não são tão boas, mas funcionam, desde que você encontre um postgresql jdbc
Compilar:
Para correr:
Exemplo de saída:
Fonte: