Buenas, não li toda a discussão, mas como alguns comentaram, é a questão do OpenSSL no modo legacy. Tive esse problema aqui usando a GCP, quando fui obrigado a subir pro PHP 8.2, pois foi desativado a partir dele.
static function reencapsularCertificadoLegado(string $certificadoBase64, string $password): string
{
$tmpDir = sys_get_temp_dir();
$certificadoBinario = base64_decode($certificadoBase64);
$caminhoCertificadoTmp = tempnam($tmpDir, uniqid('certificado'));
file_put_contents($caminhoCertificadoTmp, $certificadoBinario);
$caminhoCertificadoDecriptografadoTmp = tempnam($tmpDir, uniqid('certificado'));
$caminhoNovoCertificado = tempnam($tmpDir, uniqid('certificado'));
$comandoDescriptografar = sprintf(
'openssl pkcs12 -legacy -in %s -out %s -nodes -passin pass:%s',
escapeshellarg($caminhoCertificadoTmp),
escapeshellarg($caminhoCertificadoDecriptografadoTmp),
escapeshellarg($password)
);
exec($comandoDescriptografar . ' 2>&1', $output, $retorno);
if ($retorno !== 0) {
throw new Exception("Erro ao decriptografar certificado: " . implode("\n", $output));
}
$comandoRecriptografar = sprintf(
'openssl pkcs12 -in %s -export -out %s -passout pass:%s',
escapeshellarg($caminhoCertificadoDecriptografadoTmp),
escapeshellarg($caminhoNovoCertificado),
escapeshellarg($password)
);
exec($comandoRecriptografar . ' 2>&1', $output, $retorno);
if ($retorno !== 0) {
throw new Exception("Erro ao recriptografar certificado: " . implode("\n", $output));
}
$novoCertificadoBase64 = base64_encode(file_get_contents($caminhoNovoCertificado));
return $novoCertificadoBase64;
}
No caso, eu detecto se aconteceu o erro em questão ao abrir o certificado, se aconteceu, reencapsulo.
É na mesma linha dos comandos que o amigo ali em cima encaminhou, mas de maneira automatizada, pois é inviável fazer isso em sistemas multiclientes, com vários certificados.