Home / Programacao / Gerar Certificados Digitais Com PHP

Gerar Certificados Digitais Com PHP

<?php

}

// Exporta chave privada para PEM

$privateKeyPem = null;

$exportArgs = [];

if ($privateKeyPass) $exportArgs[] = $privateKeyPass; // senha

if (!openssl_pkey_export($privKey, $privateKeyPem, $privateKeyPass)) {

fail("Falha ao exportar a chave privada.");

}

$privateKeyFile = $outDir . '/private.key.pem';

file_put_contents($privateKeyFile, $privateKeyPem);

chmod($privateKeyFile, 0600);

// 2) Gerar CSR (Certificate Signing Request)

$csr = openssl_csr_new($dn, $privKey, ['digest_alg' => 'sha256']);

if (!$csr) {

fail("Falha ao gerar o CSR (Certificate Signing Request).\n");

}

$csrPem = null;

if (!openssl_csr_export($csr, $csrPem)) {

fail("Falha ao exportar o CSR para PEM.");

}

$csrFile = $outDir . '/request.csr.pem';

file_put_contents($csrFile, $csrPem);

// 3) Assinar o CSR (self-signed ou assinado por CA)

if ($caCertPath && $caKeyPath && file_exists($caCertPath) && file_exists($caKeyPath)) {

// Assinar usando a CA fornecida

$caCert = file_get_contents($caCertPath);

$caKey = file_get_contents($caKeyPath);

// Carrega chave privada da CA (pode ter senha)

$caPrivateKey = openssl_pkey_get_private($caKey, $caKeyPass);

if (!$caPrivateKey) fail("Não foi possível abrir a chave privada da CA.");

$cert = openssl_csr_sign($csr, $caCert, $caPrivateKey, $daysValid, ['digest_alg' => 'sha256']);

if (!$cert) fail("Falha ao assinar o CSR com a CA.");

// Exportar certificado assinado

openssl_x509_export($cert, $certPem);

$certFile = $outDir . '/cert_signed_by_ca.crt.pem';

file_put_contents($certFile, $certPem);

echo"Certificado assinado por CA gerado: $certFile\n";

} else {

// Self-signed: assina o CSR com a própria chave

$cert = openssl_csr_sign($csr, null, $privKey, $daysValid, ['digest_alg' => 'sha256']);

if (!$cert) fail("Falha ao gerar certificado self-signed.");

openssl_x509_export($cert, $certPem);

$certFile = $outDir . '/cert_self_signed.crt.pem';

file_put_contents($certFile, $certPem);

echo"Certificado self-signed gerado: $certFile\n";

}

// 4) Exporta a chave pública (opcional)

$pubKeyPkey = openssl_pkey_get_details($privKey);

if ($pubKeyPkey && isset($pubKeyPkey['key'])) {

$pubKeyPem = $pubKeyPkey['key'];

file_put_contents($outDir . '/public.key.pem', $pubKeyPem);

}

// 5) Mostrar caminhos finais

echo"Arquivos gerados na pasta: $outDir\n";

echo"- Chave privada: private.key.pem\n";

echo"- Public key: public.key.pem\n";

echo"- CSR: request.csr.pem\n";

echo"- Certificado: " . basename($certFile) . "\n";

// Limpeza

if (is_resource($privKey)) openssl_pkey_free($privKey);

if (isset($caPrivateKey) && is_resource($caPrivateKey)) openssl_pkey_free($caPrivateKey);

// Fim

?>

Pronto — coloquei um script PHP pronto para gerar certificados na canvas (arquivo gerar_certificado.php). Ele usa a extensão OpenSSL do PHP para:

  • gerar chave privada (RSA),
  • criar um CSR (Certificate Signing Request),
  • assinar o CSR como self-signed ou, se você fornecer uma CA (certificado e chave), assinar com essa CA,
  • exportar chave pública, CSR e certificado para a pasta certs/.

Como usar

  1. Verifique se o PHP tem a extensão OpenSSL ativa: php -m | grep openssl. PHP
  2. Edite as configurações no topo do arquivo ($dn, $daysValid, $keyBits, caminhos da CA se for o caso).
  3. Rode: php gerar_certificado.php.
  4. Os arquivos saem em ./certs/ (private.key.pem, public.key.pem, request.csr.pem e o certificado).

Notas importantes

  • O script usa as funções nativas openssl_* do PHP (por exemplo openssl_csr_new, openssl_csr_sign) para criar e assinar CSRs/certificados. Ver documentação das funções no manual do PHP se quiser customizar extensivamente. PHP+1
  • Para ambientes de produção e para certificados confiáveis por navegadores/clients, obtenha um certificado assinado por uma autoridade certificadora (CA) confiável — o script já suporta assinar via CA local se você fornecer paths para o certificado e chave da CA. Para testes locais, self-signed é suficiente (mas navegadores irão avisar).

Deixe um Comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *