Jump to content

PHP OpenSSLCertificar Software DGCI


pauloalves75
 Share

Recommended Posts

Viva Pessoal,

Estou a fazer umas alterações a um programa de facturação criado em PHP para corresponder aos requisitos estipulados pela DGCI. Encalhei aqui na parte da criação dos HASHKEYS.

Tenho o OPENSSL instalado, criei uma chave privada e chave pública (ambas exportados para ficheiros). Depois fiz o seguinte:

1. Gerei o certificado a partir da chave privada atravês da linha de comandos;

echo -n 1 | openssl dgst -sha1 -sign ChavePrivada.pem | openssl enc -base64 -A

2. Gerei o certificado a partir da chave privada atravês do PHP utilizando o openssl_sign();

$passphrase = "";

$signature = "";

$priv_key_file_name = "ChavePrivada.pem";

$private_key = openssl_pkey_get_private(array("file://".$priv_key_file_name, $passphrase));

$data = "1";

$signed = openssl_sign($data, $signature, $private_key, OPENSSL_ALGO_SHA1);

$signature = base64_encode($signature);

Os resultados produzidos têm o tamanho estipulado (172 bytes) mas a assinatura é diferente.

Alguem já teve este problema?

Link to comment
Share on other sites

Viva,

Tenho um problema com a certificação da DGCI, mas um pouco diferente do teu. Dizes que essa senha é diferente de qual?

No meu caso, a Sage Infologia, decidiu encriptar a chave de 172 (de onde se tem de retirar o 1º, 11º, 21º e 31º caracter para o codigo impresso na factura) e agora estou a aguardar resolução por parte da sage.

Abraços e beijinhos,Rui Costa

Link to comment
Share on other sites

Ou seja, a assinatura produzida atravês do PHP, e a assinatura produzida atravês da linha de comandos são diferentes quando deviam de ser iguais pois tou usando a mesma chave privada, e o mesmo conteudo. Utilizei "1" para ser uma string do mais simples possivel, mesmo assim os resultados produzidos são diferentes.

Link to comment
Share on other sites

Para os que estiverem interessados, encontrei o motivo deste pequeno problema. Em uma palavra é o WINDOWS!

Depois de devorar post atrás de post deste forum encontrei o motivo deste problema.

PortugalCoder diz:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

1. Evitar CR+LF no ECHO do Windows

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Para fazer um ECHO na linha de comando do windows sem CR+LF há um pequeno truque pouco

conhecido, o uso do comando SET (se omitirem as aspas ficam com um espaço extra no fim da linha):

ECHO.|SET/P="mensagem;a;assinar"

Desta forma consegue-se o efeito pretendido equivalente ao do simples ECHO em Linux ou MacOS:

echo.|set/p="2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;"|openssl dgst -sha1 -sign ChavePrivada.pem -out Signed.bin

e para verificar

echo.|set/p="2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;"|openssl dgst -sha1 -verify ChavePublica.pem -signature Signed.bin

o qual deve retornar: "Verified OK" ou "Verification Failure" ou "Error reading signature file"

Sabendo que a assinatura retornado por a função openssl_sign() produz o resultado desejado, já posso avançar com a próxima fase.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.