Resumo das etapas necessárias para geração do pedido de certificado e adesão ao webservice. Este artigo é baseado na publicação de eSkiSo no forúm Portugal a Programar. O Ambiente de reprodução dos exemplos é CentOS Linux, versão 7. O comando openssl é parte integrante de qualquer distribuição CentOS. Darei exemplo, somente, dos comandos necessários para criar e manipular os certificados. O código, em PHP, de eSkiSo, está no forúm Portugal a Programar.
Antes de fazer o pedido de adesão no Portal da AT, é necessário criar o par chave privada/pedido de certificado, com o comando:
openssl req -new -subj "/C=PT/ST=Distrito da Sede/L=Local da Sede/O=Empresa /OU=Departamento de Informatica/CN=555555555/emailAddress=informatica@empresa.pt" -newkey rsa:2048 -nodes -out 555555555.csr -keyout 555555555.key
Onde, 555555555 pode ser substituído pelo número de contribuinte, por exemplo.
Em resposta, a AT envia um ficheiro 555555555.cer que deve ser integrado com a chave privada 555555555.key, criada anteriormente. Vai ser necessário definir uma password. Tomar nota, pois teremos de a utilizar mais adiante e no código PHP:
openssl pkcs12 -export -in 555555555.cer -inkey 555555555.key -out 555555555.pfx
Estas instruções também estão documentadas no Portal da AT. A partir deste momento, ficamos com um ficheiro PFX, que é necessário tratar para integrar na linguagem PHP e na respectiva extensão CURL (o mesmo mecanismo utilizado por eSkiSo). É necessário separar o certificado e a chave privada em dois ficheiros no formato PEM. Para extrair o certificado, executar:
openssl pkcs12 -in 555555555.pfx -clcerts -nokeys -out pfxcert.pem
Para extrair a chave, do PFX, executar:
openssl pkcs12 -in 555555555.pfx -nocerts -out pfxKey.pem
No entanto, em ambiente CURL + NSS, é necessário transformar esta última chave gerada, em RSA PRIVATE KEY, com o comando:
openssl rsa -in pfxKey.pem -out newpfxKey.pem