Esta classe é responsável por tratar a utilização dos certificados digitais modelo A1 (PKCS#12).
Com o uso dessas classes não mais é necessário que existam certificados em arquivo, ou seja, você pode optar por manter os certificados em base de dados, arquivo, arquivo remoto, repositório ou qualquer outra forma que deseje.
Para usar um certificado PFX basta obter seu conteúdo e passar para a classe com sua respectiva senha.
NFePHP\Common\Certificate\PrivateKey
NFePHP\Common\Certificate\PublicKey
NFePHP\Common\Certificate\CertificationChain
NFePHP\Common\Certificate\Asn1
Instância de PrivateKey::class
Instância de PublicKey::class
Instância de CertificationChain::class
** Forma principal de uso**
use NFePHP\Common\Certificate;
use NFePHP\Common\Certificate\CertificationChain;
$pfx = file_get_contents('<CAMINHO PARA O ARQUIVO PFX>');
$cert = Certificate::readPfx($pfx, '<SENHA>');
//carrega a cadeia de certificados, usar apenas se necessário
$strchain = file_get_contents('<CAMINHO PARA CADEIA NO FORMATO PEM>');
$chain = new CertificationChain($strchain);
$cert->chainKeys = $chain;
- $privateKey = Instância de PrivateKey::class
- $publicKey = Instância de PublicKey::class
- $chainKeys = Instância de CertificationChain::class
Exceptions
Forma de USO
use NFePHP\Common\Certificate\PrivateKey;
use NFePHP\Common\Certificate\PublicKey;
use NFePHP\Common\Certificate\CertificationChain;
try {
$priKey = new PrivateKey($privatekeyContent);
$pubKey = new PublicKey($publickeyContent);
$chain = new CertificationChain($chainkeysContent);
$certs = new Certificate($priKey, $pubKey, $chain);
} catch (\Exception $e) {
//aqui você trata as exceções
$e->getMessage();
}
Alternativamente essa classe pode ser carregada estaticamente com a chamada readPfx().
Parâmetro | Tipo | Descrição |
---|---|---|
$content | string | conteúdo do arquivo PFX |
$password | string | senha de acesso ao certificado |
NOTA: $content é uma string com o conteúdo do PFX (Certificado A1) esse conteúdo pode ser mantido em tabela no banco de dados ou em arquivo (local ou remoto). O único cuidado é lembrar que um PFX é um registro binário então ao tentar mante-lo em base de dados converta para base64.
use NFePHP\Common\Certificate;
use NFePHP\Common\Exception\CertificateException;
try {
$cert = Certificate::readPfx($content, $password);
} catch (\Exception $e) {
//aqui você trata a exceção
$e->getMessage();
}
Esse método permite que o PFX seja recriado com base em sua chave pública, privada e irá incluir toda a cadeia de certificação, se fornecida.
$password = senha de acesso ao certificado pfx (parâmetro obrigatório)
$novopfx = $cert->writePfx('senha');
Esse método irá retorna a Razão Social gravada no certificado
$razao = $cert->getCompanyName();
Esse método irá retornar uma classe \DateTime com a a data de início da validade, ou seja a data de criação do certificado.
$validFrom = $cert->getValidFrom();
echo $validFrom->format('Y-m-d');
Esse método irá retornar uma classe \DateTime com a a data FINAL da validade, ou seja, a data limite de uso. Em geral um ano após a emissão.
$validFrom = $cert->getValidTo();
echo $validTo->format('Y-m-d');
Esse método irá retornar TRUE se o certificado tiver a data expirada, ou seja, não está mais válido, ou FALSE se ainda estiver válido.
if ($cert->isExpired()) {
echo "Certificado VENCIDO! Não é possivel mais usá-lo";
} else {
echo "Certificado VÁLIDO!";
}
Esse método irá retornar o número do CNPJ
echo "CNPJ: " . $cert->getCnpj();
Este método cria a assinatura digital usando a chave Privada.
NOTA: usualmente é usado o algoritmo OPENSSL_ALGO_SHA1, mas existem casos em que poderemos ter que usar outros algoritmos como o OPENSSL_ALGO_SHA256, por exemplo.
$content = "dados a serem assinados";
echo base64_encode($cert->sign($content, OPENSSL_ALGO_SHA1));
//o retorno foi convertido para base64 pois contêm dados binários
Este método valida a assinatura usando a chave Pública.
$data = "dados a serem assinados";
$signature = "rleddaKS731zeLAFuhpXOglVm2UOlAbWxZNvZbNS5NueumeGBSCmxuuYcubUCTgoB+RJzPIzU45eUbfN8B41q+WPWmsyQcWslm7geTyCrWnCJNaYGq5cVJ5eCqTRErQYSo/pBVizDLqyn+UmGUxhn+73sVlPM0kFqiFPpRCmG3azxRD60X48PDi42wvtxbe47FGZuj0XeRqoUvEra2FZPDxoYYrZqvRVHxzZtRpi+Wvp3FcbF+0WsxNgg9xXi4+TgfGDbrOlbx0PxhrvZAWvkKZTiSBKxqvYgeXgIk9KNLkm0UG/u8Gk5DLVEuC3QIdsVcl+dFPapXf0JJIAa4OpjQ==";
//a assinatura foi convertida para base64 pois contêm caracteres binários
if ($cert->verify($data, base64_decode($signature), OPENSSL_ALGO_SHA1)) {
echo "Assinatura Confere !!!";
} else {
echo "ERRO. A assinatura NÃO confere";
}
Este método retorna a chave pública e a cadeia de certificação, se houver em uma string no formato PEM
echo "{$cert}";