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)serialNumbervalidFrom_time_tvalidTo_time_textensions, 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.
