Verificando a Validade de Certificados Digitais X.509 salvos no Banco de Dados usando PHP

Muitos sistemas armazenam certificados digitais diretamente no banco de dados. Seja para gerenciar múltiplos domínios, gateways, autenticação mútua ou integração com APIs, saber quando esses certificados vencem é fundamental para evitar interrupções. O PHP fornece suporte nativo para isso através da extensão OpenSSL.

O problema

Você tem o conteúdo do certificado (em formato PEM) salvo em um campo TEXT ou LONGTEXT no banco de dados e precisa:

  • Saber a data de emissão
  • Saber a data de expiração
  • Automatizar alertas de renovação

Exemplo de conteúdo típico salvo

-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSq...
...demais linhas do certificado...
-----END CERTIFICATE-----

Solução direta com PHP

A função openssl_x509_parse() faz todo o trabalho.

Exemplo funcional:

<?php
// Suponha que $cert seja o conteúdo vindo do banco
$cert = <<<CERT
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx
...restante omitido por brevidade...
-----END CERTIFICATE-----
CERT;

$info = openssl_x509_parse($cert);

echo "Emitido em: " . date('Y-m-d H:i:s', $info['validFrom_time_t']) . "\n";
echo "Expira em: "  . date('Y-m-d H:i:s', $info['validTo_time_t']) . "\n";

Saída esperada:

Emitido em: 2018-11-29 11:55:54
Expira em: 2043-11-29 11:55:54

Estrutura do array retornado

A função retorna um array associativo com todos os detalhes úteis, como:

  • subject (DN do certificado)
  • issuer (emissor)
  • serialNumber
  • validFrom_time_t
  • validTo_time_t
  • extensions, se houver

Validando todos os certificados do banco

Um exemplo genérico com PDO:

$dbh = new PDO('mysql:host=localhost;dbname=seu_banco', 'usuario', 'senha');

$stmt = $dbh->query("SELECT id, certificado FROM certificados");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $cert = $row['certificado'];
    $info = openssl_x509_parse($cert);

    echo "ID {$row['id']} - Válido até: " . date('Y-m-d', $info['validTo_time_t']) . "\n";
}

Alertando certificados vencidos ou próximos de vencer

$prazo = 30 * 24 * 60 * 60; // 30 dias
$agora = time();

if ($info['validTo_time_t'] - $agora < $prazo) {
    echo "Certificado próximo do vencimento.\n";
}

Requisitos

  • PHP com a extensão OpenSSL habilitada (ativo por padrão)
  • Certificados válidos e bem formatados (começando com -----BEGIN CERTIFICATE-----)
  • Armazenamento do conteúdo completo no banco (não apenas fingerprints)

Considerações finais

Você não precisa depender de ferramentas externas para monitorar certificados. Com uma abordagem simples e nativa em PHP, é possível construir dashboards internos, sistemas de notificação e rotinas de auditoria automatizadas. Para quem lida com APIs, gateways, autenticação ou infraestrutura crítica, monitorar a validade de certificados não é luxo — é obrigação.

Rolar para cima