<?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
- Verifique se o PHP tem a extensão OpenSSL ativa:
php -m | grep openssl
. PHP - Edite as configurações no topo do arquivo (
$dn
,$daysValid
,$keyBits
, caminhos da CA se for o caso). - Rode:
php gerar_certificado.php
. - 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 exemploopenssl_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).